COM互操作,DllImport与添加引用的区别

5

我正在尝试进入COM互操作领域。

下面是一个简单的例子:

  SpeechLib.SpVoice voice = new SpVoice();
  voice.Speak("Hello sucker!",SpeechVoiceSpeakFlags.SVSFDefault);

当然,在之前我需要添加对%windir%\system32\speech\common\sapi.dll的引用,VS会将Interop.SpeechLib.dll添加到项目文件夹中,现在我必须将这个200kb的库与我的简单4kb应用程序一起分发。
我能否使用[DllImport]而不是添加引用,因为在大多数情况下,语音库已经存在于客户端的计算机上了?
您可以展示一下如何使用DllImport技术重写上面的代码吗?
3个回答

6
如果Speech API是一个COM API,则不太可能使用[DllImport]来代替“添加引用”。 [DLLImport]用于调用未托管的Win32 DLL,而“添加引用”是运行tlbimp.exe(类型库导入)的快捷方式,以启用.NET对COM互操作。
您可以在此处了解有关COM互操作的更多信息:链接,并在此处了解DllImportAttribute链接。PInvoke.net是查找DllImport签名的绝佳网站。

2

[DllImport]不是您想要的。但是,当您添加COM引用时看到的互操作库只是一种便利;您随时可以自己编写。

最简单的方法是使用Reflector将COM互操作程序集(在您的情况下为Interop.SpeechLib.dll)反汇编为源文件树。

互操作程序集将包含所有类型库中的COM类型的.NET声明,这通常是您想要的,但如果您只需要其中的一小部分,则可以摆脱不需要的部分。

如果您不喜欢有第二个DLL依赖项,甚至可以将Reflector生成的源文件添加到现有项目中,从而将它们编译到您的程序集中。


0

1
这个方法可以实现,但是不要将 Copy Local 设置为 false,而是将 Embed Interop Types 设置为 true,这样你使用的类型就会成为程序集的一部分,此时 Copy Local 就变成了 false,无法更改。 - nurchi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接