COM Interop,DllImport vs.添加引用

时间:2009-08-19 03:58:18

标签: c# com interop

我正试图进入COM互操作

所以,有一个简单的例子:

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

当然我之前必须添加对%windir%\system32\speech\common\sapi.dll的引用,VS会将Interop.SpeechLib.dll添加到项目文件夹中,现在我必须用我的简单4kb应用程序分发这个200kb的库。

我可以使用[DllImport]而不是添加引用,因为在大多数情况下,语音库已经在客户端的计算机上显示了吗?

你能告诉我如何使用DllImport技术重写上面的代码吗?

3 个答案:

答案 0 :(得分:5)

如果Speech API是COM API,则您不太可能使用[DllImport]而不是“添加引用”。

[DLLImport]用于调用非托管的Win32 DLL,而“添加引用”是运行tlbimp.exe(typelib import)以使.NET与COM互操作的捷径。

您可以详细了解COM互操作hereDllImportAttribute here。 Pinvoke.net是一个寻找DllImport签名的好网站。

答案 1 :(得分:2)

[DllImport]不是你想要的。但是,您在添加COM引用时看到的互操作库只是一个方便;你总是可以自由地写自己的。

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

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

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

答案 2 :(得分:0)

要缩小文件大小,您可以使用Copy Local set to false.

进行参考