调用COM wituout COM interop dll

时间:2011-07-24 17:16:54

标签: c# com

我正在开发需要向桌面操作发送快捷方式的应用程序。我发现只有一种方法可以实现它:

var shell = new IWshRuntimeLibrary.WshShell();
var shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(linkFileName);
shortcut.TargetPath = Application.ExecutablePath;
shortcut.WorkingDirectory = Application.StartupPath;
shortcut.Save();

它正在运行coreect,但需要Interop.IWshRuntimeLibrary.dll。 我的应用程序需要通过一个小的exe文件进行部署,我不能将任何其他文件包含在包中。

在没有interop dll的情况下调用COM的方法是什么?

3 个答案:

答案 0 :(得分:15)

是的,您可以在没有互操作库的情况下在.NET中创建COM对象。只要它们的COM对象实现了IDispatchWScript.Shell),就可以轻松调用方法和属性。

如果您使用的是.NET 4,则动态类型使这非常容易。如果不是,你将不得不使用Reflection来调用方法,这些方法可以工作但不是很漂亮。

带动态的.NET 4

Type shellType = Type.GetTypeFromProgID("WScript.Shell");
dynamic shell = Activator.CreateInstance(shellType);
dynamic shortcut = shell.CreateShortcut(linkFileName);
shortcut.TargetPath = Application.ExecutablePath;
shortcut.WorkingDirectory = Application.StartupPath;
shortcut.Save();

带反射的.NET 3.5或更早版本

Type shellType = Type.GetTypeFromProgID("WScript.Shell");
object shell = Activator.CreateInstance(shellType);
object shortcut = shellType.InvokeMember("CreateShortcut",
      BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod,
      null, shell, new object[] { linkFileName });
Type shortcutType = shortcut.GetType();
shortcutType.InvokeMember("TargetPath",
      BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty,
      null, shortcut, new object[] { Application.ExecutablePath });
shortcutType.InvokeMember("WorkingDirectory",
      BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty, 
      null, shortcut, new object[] { Application.StartupPath });
shortcutType.InvokeMember("Save",
      BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod,
      null, shortcut, null);

答案 1 :(得分:4)

您可以使用名为ILMerge的Microsoft实用程序(可从here下载)将DLL合并到您的exe中。

有关如何在this article

中使用它的简要说明

答案 2 :(得分:3)

好的,因为ILMerge因某种原因无法解决。

C#包括与底层COM和Windows DLL交互的能力。您可以在EXE中编写自己的COM互操作。

以下是an article,介绍了如何执行此操作。