2016-04-28 5 views
1

Nur aus Neugier, was ist der Unterschied zwischen einer Referenz in den Reference Manager von Visual Studio als „Montagerahmen“ Hinzufügen gegen ihn als „COM-Typbibliothek hinzufügen "? Ich weiß, dass COM-Typ-Bibliotheken nicht für alle Referenzen verfügbar sind.Visual Studio Reference Manager - Montagerahmen vs. COM Type Library

Zum Beispiel:

Reference as an Assembly Framework

Oder ich kann es als „COM-Typbibliothek“ verwenden: Wenn ich mit dem Microsoft Speech API arbeiten will, muss ich es als „assembly Rahmen“ verwenden können, :

Reference as a COM Type Library

ich suche nichts mit dem Microsoft Speech API zu implementieren. Dies wurde nur als Beispiel genommen, um zu erläutern, was ich verlange.

Was ist der Unterschied zwischen einer dieser beiden Optionen?

Beziehen sich auf die gleichen Bibliotheken? Ich sehe, dass die Versionsnummer im rechten Bereich der beiden Screenshots unterschiedlich ist.

Vielen Dank im Voraus!

Antwort

1

Was ist der Unterschied zwischen einer dieser beiden Optionen?

Sie sind völlig verschiedene Plattformen. COM existiert seit längerem und wurde verwendet, um Windows-Anwendungen vor der Entwicklung von .NET eine gemeinsame Funktionalität zu bieten. Es gilt jetzt als "Vermächtnis" und ist schwerer zu verstehen.

Die Unterschiede zwischen den beiden sind zu zahlreich zu diesem Forum, aber sie sind wie Apps für Android und iOS zu vergleichen - sie sind für den Verzehr durch zwei verschiedene Kunden gedacht. Einige Apps existieren für beide, aber viele existieren für das eine oder das andere. Einige Bibliotheken offenbaren Methoden für beide; einige nur eins oder das andere.

Wenn Sie eine Bibliothek aus einer .NET-Anwendung referenzieren, möchten Sie IMMER auf die .NET-Assembly verweisen, außer in sehr seltenen Fällen (z. B. wenn die COM-Bibliothek andere Funktionen als die Assembly hat).

Beziehen sie sich auf die gleichen Bibliotheken?

Nicht direkt - es kann Wrapper für die eine oder andere, die denselben Code unter Verwendung sein, aber auf der Interop-Ebene sind sie nicht gleich.

+0

Also, wo sind die COM-Objekte im "Reference Manager" auf einer Arbeitsstation aufgeführt? Ich glaube, die im Abschnitt "Assembly-Framework" aufgelisteten Elemente stammen aus dem GAC. In dem 'Microsoft Speech API' Beispiel stammt die COM-Typenbibliothek von% windir% \ System32 \ Speech \ Common \ sapi.dll? – slayernoah

+0

Oder ist es umgekehrt, wenn die COM-Typen im Reference Manager vom GAC übernommen werden? – slayernoah

+0

COM-Bibliotheken sind mit dem System "registriert" und können praktisch an jedem Ort sein. Alle diese Verknüpfung wird in der Registrierung gespeichert. Es gibt keine einfache Möglichkeit, den physischen Speicherort einer COM-Bibliothek anhand ihres Namens zu bestimmen. Es dauert einige Brotkrumen suchen in der Registrierung, die nicht angenehm ist. –

2

Sie erhalten eine leicht archäologische Sicht, das sind die Apis, die Programmierer verwendet haben, bevor .NET verfügbar wurde. In diesem Fall für SAPI, die Speech API, die es seit ~ 1995 gibt. Der COM-Wrapper dafür ist nicht gerade veraltet, Sie verwenden ihn immer noch, wenn Sie Code in, sagen wir, C++ oder eine Skriptsprache wie Javascript schreiben.

Microsoft entschieden dafür ein .NET-centric-Wrapper zu erstellen. Fairer Aufruf, der COM-Wrapper macht keine gute Arbeit, wenn Sie Ereignisse hören wollen. Nicht das einzige Beispiel, andere gute sind System.Management (Wraps WMI), System.Messaging (Wraps MQ), System.Data.OleDb (Wraps ADO), System.DirectoryServices (Wraps AD).

Es gibt keinen zwingenden Grund, den COM-Wrapper zu favorisieren, System.Speech wurde ziemlich gut gemacht und ist komplett. Im Allgemeinen gibt es einen starken Push innerhalb von Microsoft, um COM zu verstecken, die Programmierung kann ziemlich unangenehm sein, besonders wenn es nicht die Automatisierungsuntermenge ist. Es macht wenig Freude, Core Apis wie WASAPI oder DirectX direkt zu programmieren.

Der vollständigste Wrapping-Job ist wahrscheinlich Univeral Windows (aka WinRT, aka Store-Apps, alias Modern UI, alias UWP), durch und durch modern und gründlich COM in seinem Kern. Sehr gut versteckt, ist die "Sprachprojektion" ein ziemlich netter Trick. Ansonsten bietet sich die einfache Möglichkeit, eine Javascript-App direkt mit einer C++ - Komponente zu kommunizieren. Und der Grund, warum Fehlermeldung so lausig ist :)