2009-08-19 10 views
4

Ich versuche, in COM-Interop SoCOM Interop, DllImport gegen das Hinzufügen eines Verweises

zu bekommen, gibt es ein einfaches Beispiel:

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

Natürlich habe ich Bezug auf% windir hinzufügen % \ system32 \ speech \ common \ sapi.dll vorher, und VS fügt Interop.SpeechLib.dll dem Projektordner hinzu, und jetzt muss ich diese 200kb-Bibliothek mit meiner einfachen 4kb-Anwendung verteilen.

Kann ich [DllImport] anstelle eines Verweises verwenden, da die Sprachbibliothek in den meisten Fällen bereits auf dem Computer eines Clients angezeigt wird?

Können Sie mir zeigen, wie Sie den obigen Code mithilfe der DllImport-Technik neu schreiben?

Antwort

5

hilft Sie sind kaum in der Lage sein zu verwenden [DllImport] anstelle von „Add Reference“, wenn die Sprach-API eine COM API ist.

[DLLImport] wird zum Aufrufen von nicht verwalteten Win32-DLLs verwendet, während "Add Reference" eine Abkürzung zum Ausführen von tlbimp.exe (Typelib-Import) ist, um .NET zu COM-Interop zu aktivieren. Sie können mehr über COM Interop here und DllImportAttribute here erfahren. Pinvoke.net ist eine großartige Seite um DllImport Signaturen zu finden.

2

[DllImport] ist nicht was Sie wollen. Die Interop-Bibliothek, die Sie sehen, wenn Sie eine COM-Referenz hinzufügen, ist jedoch nur eine Annehmlichkeit; Sie sind immer frei, stattdessen Ihre eigenen zu schreiben.

Der einfachste Weg, dies zu sehen ist, Reflektor zu verwenden, um die COM-Interop-Assembly (Interop.SpeechLib.dll in Ihrem Fall) in einen Baum von Quelldateien zu zerlegen.

Die Interop-Assembly enthält .NET-Deklarationen für alle COM-Typen in der Typbibliothek, was normalerweise das ist, was Sie wollen, aber wenn Sie nur eine kleine Teilmenge davon benötigen, können Sie die Bits loswerden, die Sie nicht benutzen. t brauchen.

Wenn Sie nicht gerne eine zweite DLL-Abhängigkeit haben, können Sie sogar die von Reflector generierten Quelldateien zu Ihrem bestehenden Projekt hinzufügen und diese in Ihre Assembly kompilieren.

0

die Dateigröße zu reduzieren, können Sie die Referenz mit Copy Local set to false. haben

+0

wird nicht funktionieren - die verwalteten Code beruht auf der Interop. – sharptooth

+1

Dies funktioniert, aber anstatt 'Copy Local' auf' false' zu ​​setzen, setzen Sie 'Embed Interop Types' auf 'true' und die von Ihnen verwendeten Typen werden Teil der Assembly, in diesem Fall wird' Copy Local' zu 'false' und kann nicht geändert werden. – nurchi

Verwandte Themen