2009-08-19 60 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

相關問題