我正试图进入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
技术重写上面的代码吗?
答案 0 :(得分:5)
如果Speech API是COM API,则您不太可能使用[DllImport]
而不是“添加引用”。
[DLLImport]
用于调用非托管的Win32 DLL,而“添加引用”是运行tlbimp.exe(typelib import)以使.NET与COM互操作的捷径。
您可以详细了解COM互操作here和DllImportAttribute
here。 Pinvoke.net是一个寻找DllImport
签名的好网站。
答案 1 :(得分:2)
[DllImport]
不是你想要的。但是,您在添加COM引用时看到的互操作库只是一个方便;你总是可以自由地写自己的。
最简单的方法是使用Reflector将COM互操作程序集(在您的情况下为Interop.SpeechLib.dll
)反汇编为源文件树。
互操作程序集将包含类型库中所有COM类型的.NET声明,这通常是您想要的,但如果您只需要一小部分,那么您可以删除不需要的部分需要。
如果您不喜欢第二个DLL依赖项,您甚至可以将Reflector生成的源文件添加到现有项目中,从而将它们编译到程序集中。
答案 2 :(得分:0)
要缩小文件大小,您可以使用Copy Local
set to false
.