调用没有COM互操作dll的COM

本文关键字:COM dll 互操作 调用 | 更新日期: 2023-09-27 18:03:12

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

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

它工作正常,但需要interop . iw萎缩时间图书馆.dll。我的应用程序需要通过一个小的exe文件进行部署,我不能在包中包含任何其他文件。

在哪里没有互操作dll调用COM的方法?

调用没有COM互操作dll的COM

是的,你可以在。net中创建一个COM对象而不需要互操作库。只要它们的COM对象实现了IDispatch (WScript。你可以很容易地在Shell上调用方法和属性。

如果你使用的是。net 4,动态类型会让这变得非常容易。如果不是,你将不得不使用反射来调用方法,这将工作,但不是那么漂亮。

。带有动态

的。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);

你可以使用一个名为ILMerge的微软实用程序,从这里下载,将DLL合并到你的exe中。

在这篇文章中有一个关于如何使用它的简短描述

好吧,因为某些原因,ILMerge是不可接受的。

c#包含了与底层COM和Windows dll交互的能力。你可以在EXE中编写自己的COM互操作。