【C#】インターネット ショートカットを普通のショートカットに変換する

Windows 上にあるインターネットショートカットを普通のショートカットに変換するプログラムです。

既定のブラウザに関わらず指定したブラウザ(Chorome)で強制的に開くように変換します。

using IWshRuntimeLibrary;
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;

namespace ConsoleApp1
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            createShortcut(args[0], getUrl(args[0]));
        }

        /// <summary>
        /// 指定したインターネットショートカットからURLを取得します。
        /// </summary>
        private static string getUrl(string path)
        {
            string[] lines = System.IO.File.ReadAllLines(path);
            if (lines[0] != "[InternetShortcut]")
            {
                throw new NotSupportedException("1行目がショートカットではありません。");
            }

            for (int i = 1; i < lines.Length; i++)
            {
                if (lines[i].StartsWith("URL"))
                {
                    return lines[i].Split('=')[1];
                }
            }

            throw new InvalidDataException("URLタグが見つかりませんでした。");
        }

        private static void createShortcut(string path, string url)
        {
            // 起動するプログラム(=Chorome)
            string programPath = @"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe";

            // ショートカットの生成先
            string dir = Path.GetDirectoryName(path);
            string name = Path.GetFileNameWithoutExtension(path);
            string destPath = Path.Combine(dir, name + ".lnk");

            using (var gen = new ShortcutGenerator())
            {
                // (1) リンク先:起動するプログラムのパス
                IWshShortcut info = gen.GetInfo(destPath);
                info.TargetPath = programPath;
                // (2) 引数
                info.Arguments = url;
                // (3) 作業フォルダ
                info.WorkingDirectory = Path.GetDirectoryName(programPath);
                // (4) 実行時の大きさ 1が通常、3が最大化、7が最小化
                info.WindowStyle = 1;
                // (5)アイコンのパス 自分のEXEファイルのインデックス0のアイコン
                info.IconLocation = 
                    @"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" + ",0";
                gen.Save(info);
            }
        }
    }

    /// <summary>
    /// ショートカットを作成するためのクラス
    /// </summary>
    public class ShortcutGenerator : IDisposable
    {
        //
        // Fields
        // - - - - - - - - - - - - - - - - - - - -

        // ショートカット生成用のCOMオブジェクト
        private WshShell shell = new WshShell();
        // 生成したCOMコンテナの数
        private List<IWshShortcut> shortcutList = new List<IWshShortcut>();
        // Dispose したかどうかのフラグ
        // true : Dispose済み / false : まだ
        private bool isDisposed;

        //
        // Constructors
        // - - - - - - - - - - - - - - - - - - - -

        /// <summary>
        /// オブジェクトを破棄します。
        /// </summary>
        ~ShortcutGenerator()
        {
            this.Dispose();
        }

        //
        // Public Methods
        // - - - - - - - - - - - - - - - - - - - -

        /// <summary>
        /// ショートカットへ与えるデータを格納するオブジェクトを生成します。
        /// </summary>
        public IWshShortcut GetInfo(string path)
        {
            var info = (IWshShortcut)shell.CreateShortcut(path);
            this.shortcutList.Add(info);
            return info;
        }

        /// <summary>
        /// 既存のショートカットをロードします。
        /// </summary>
        public IWshShortcut Load(string path)
        {
            var info = (IWshShortcut)shell.CreateShortcut(path);
            info.Load(path);
            this.shortcutList.Add(info);
            return info;
        }

        /// <summary>
        /// ショートカットを生成します。
        /// </summary>
        public void Save(IWshShortcut info) => info.Save();

        /// <summary>
        /// <see cref="IDisposable"/> の実装。
        /// </summary>
        public void Dispose()
        {
            if (isDisposed)
            {
                return;
            }
            isDisposed = true;

            for (int i = 0; i < this.shortcutList.Count; i++)
            {
                Marshal.FinalReleaseComObject(shortcutList[i]);
            }
            this.shortcutList.Clear();
            this.shortcutList = null;

            Marshal.FinalReleaseComObject(shell);
            this.shell = null;

            GC.SuppressFinalize(this);
        }
    }
}