2009年9月13日日曜日

[.NET]ショートカット(lnk)を作成する(COM参照なし)

.NET Frameworkにはショートカット(lnkファイル)を作るインタフェースは提供されていません。
しかし、VBScriptではWScript.ShellのCreateShortcutを使えば簡単にショートカットを作ることができます。
そのため、.NETアプリケーションからショートカットを作りたければ、COM Interopすればよいことになります。具体的には「参照の追加」でCOM の「 Windows Script Host Object Model」を追加し、それらしいクラスを使ってVBScriptと同じような処理をすればよいことになります。しかし、アセンブリと同じフォルダにInterop アセンブリ(DLL)をおく必要があります。

個人的に・・・ですが、InteropのDLLをみるとげんなりしてしまいます。で、ほかの方法は無いか?と考えたときに、遅延バインディングでCOMを呼び出す方法を思い出しました。
VB.NETではコンパイルオプションで、遅延バインディングが可能ですが、あえてC#。コードはこんな感じ。

/// <summary>
/// ショートカットの作成
/// </summary>
/// <remarks>WSHを使用して、ショートカット(lnkファイル)を作成します。(遅延バインディング)</remarks>
/// <param name="path">出力先のファイル名(*.lnk)</param>
/// <param name="targetPath">対象のアセンブリ(*.exe)</param>
/// <param name="description">説明</param>
private void CreateShortCut(String pathString targetPathString description)
{
    //using System.Reflection;

    // WSHオブジェクトを作成し、CreateShortcutメソッドを実行する
    Type shellType = Type.GetTypeFromProgID("WScript.Shell");
    object shell = Activator.CreateInstance(shellType);
    object shortCut = shellType.InvokeMember("CreateShortcut"BindingFlags.InvokeMethodnullshellnew object[] { path });

    Type shortcutType = shell.GetType();
    // TargetPathプロパティをセットする
    shortcutType.InvokeMember("TargetPath"BindingFlags.SetPropertynullshortCutnew object[] { targetPath });
    // Descriptionプロパティをセットする
    shortcutType.InvokeMember("Description"BindingFlags.SetPropertynullshortCutnew object[] { description });
    // Saveメソッドを実行する
    shortcutType.InvokeMember("Save"BindingFlags.InvokeMethodnullshortCutnull);

}


コンパイラーにてシンタックス的なエラーを発見することができないのでアレですが、意外と簡単?ですね。

C# 4.0 では、言語レベルで遅延バインディング(Dynamic)がサポートされるようです。そうなるとこんな書き方はしなくてもすむんですけどね。

0 件のコメント: