2009-08-19 48 views
4

我试图进入COM互操作COM互操作,主场迎战的DllImport添加引用

因此,有一个简单的例子:

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技术重写上面的代码吗?

回答

5

你是不太可能能够使用函数[DllImport],而不是“添加引用”如果语音API是一个COM API。

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

您可以了解更多关于COM Interop here和DllImportAttribute here的信息。 Pinvoke.net是查找DllImport签名的绝佳网站。

2

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

最简单的方法是使用Reflector将COM interop程序集(您的案例中的Interop.SpeechLib.dll)反汇编到源文件树中。

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

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

0

要减小文件大小,你可以有Copy Local set to false.

+0

引用将无法正常工作 - 托管代码依赖于互操作。 – sharptooth 2016-04-29 11:18:08

+1

这会起作用,但不是将'Copy Local'设置为'false',而是将'Embed Interop Types'设置为true,并且您使用的类型将成为程序集的一部分,在这种情况下'Copy Local'变为'false'并且不能改变。 – nurchi 2016-08-31 20:43:03