しかし、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 path, String targetPath, String description)
{
//using System.Reflection;
// WSHオブジェクトを作成し、CreateShortcutメソッドを実行する
Type shellType = Type.GetTypeFromProgID("WScript.Shell");
object shell = Activator.CreateInstance(shellType);
object shortCut = shellType.InvokeMember("CreateShortcut", BindingFlags.InvokeMethod, null, shell, new object[] { path });
Type shortcutType = shell.GetType();
// TargetPathプロパティをセットする
shortcutType.InvokeMember("TargetPath", BindingFlags.SetProperty, null, shortCut, new object[] { targetPath });
// Descriptionプロパティをセットする
shortcutType.InvokeMember("Description", BindingFlags.SetProperty, null, shortCut, new object[] { description });
// Saveメソッドを実行する
shortcutType.InvokeMember("Save", BindingFlags.InvokeMethod, null, shortCut, null);
}
/// ショートカットの作成
/// </summary>
/// <remarks>WSHを使用して、ショートカット(lnkファイル)を作成します。(遅延バインディング)</remarks>
/// <param name="path">出力先のファイル名(*.lnk)</param>
/// <param name="targetPath">対象のアセンブリ(*.exe)</param>
/// <param name="description">説明</param>
private void CreateShortCut(String path, String targetPath, String description)
{
//using System.Reflection;
// WSHオブジェクトを作成し、CreateShortcutメソッドを実行する
Type shellType = Type.GetTypeFromProgID("WScript.Shell");
object shell = Activator.CreateInstance(shellType);
object shortCut = shellType.InvokeMember("CreateShortcut", BindingFlags.InvokeMethod, null, shell, new object[] { path });
Type shortcutType = shell.GetType();
// TargetPathプロパティをセットする
shortcutType.InvokeMember("TargetPath", BindingFlags.SetProperty, null, shortCut, new object[] { targetPath });
// Descriptionプロパティをセットする
shortcutType.InvokeMember("Description", BindingFlags.SetProperty, null, shortCut, new object[] { description });
// Saveメソッドを実行する
shortcutType.InvokeMember("Save", BindingFlags.InvokeMethod, null, shortCut, null);
}
コンパイラーにてシンタックス的なエラーを発見することができないのでアレですが、意外と簡単?ですね。
C# 4.0 では、言語レベルで遅延バインディング(Dynamic)がサポートされるようです。そうなるとこんな書き方はしなくてもすむんですけどね。
0 件のコメント:
コメントを投稿