Freigeben über


Runtime Callable Wrapper (RCW)

Die Common Language Runtime macht COM-Objekte über einen Proxy verfügbar, der RCW (Runtime Callable Wrapper, Aufrufwrapper der Common Language Runtime) genannt wird. Obwohl die RCW ein normales Objekt für .NET-Clients sein scheint, besteht die primäre Funktion darin, Aufrufe zwischen einem .NET-Client und einem COM-Objekt zu marshallen.

Die Laufzeit erstellt genau ein RCW für jedes COM-Objekt, unabhängig von der Anzahl der Verweise, die für dieses Objekt vorhanden sind. Die Common Language Runtime verwaltet für jedes Objekt einen einzelnen RCW pro Prozess. Wenn Sie ein RCW in einer Anwendungsdomäne oder einem Apartment erstellen und dann einen Verweis auf eine andere Anwendungsdomäne oder ein anderes Apartment übergeben, wird ein Proxy für das erste Objekt verwendet. Beachten Sie, dass dieser Proxy ein neues verwaltetes Objekt ist und nicht mit dem ursprünglichen RCW identisch ist. Dies bedeutet, dass die beiden verwalteten Objekte nicht gleich sind, aber dasselbe COM-Objekt darstellen. Wie die folgende Abbildung zeigt, kann eine beliebige Anzahl von verwalteten Clients einen Verweis auf die COM-Objekte halten, die die Schnittstellen INew und INewer bereitstellen.

Die folgende Abbildung veranschaulicht, wie über den RCW auf COM-Objekte zugegriffen wird:

Prozess für den Zugriff auf COM-Objekte über rcW.

Mithilfe von Metadaten, die von einer Typbibliothek abgeleitet wurden, erstellt die Laufzeit sowohl das COM-Objekt, das aufgerufen wird, als auch einen Wrapper für dieses Objekt. Jeder RCW verwaltet einen Cache von Schnittstellenzeigern auf dem COM-Objekt, das es umschließt, und gibt seinen Verweis auf das COM-Objekt frei, wenn der RCW nicht mehr benötigt wird. Die Common Language Runtime führt eine Garbage Collection für den RCW durch.

Unter anderem vermittelt der RCW Daten zwischen verwaltetem und nicht verwaltetem Code im Auftrag des umschlossenen Objekts. Insbesondere stellt das RCW Marshalling für Methodenargumente und Methodenrückgabewerte bereit, wenn der Client und der Server unterschiedliche Darstellungen der zwischen ihnen übergebenen Daten aufweisen.

Der Standardwrapper erzwingt integrierte Marshallregeln. Wenn ein .NET-Client beispielsweise einen string Typ als Teil eines Arguments an ein nicht verwaltetes Objekt übergibt, konvertiert der Wrapper den string Typ in einen BSTR Typ. Wenn das COM-Objekt einen BSTR an den verwalteten Aufrufer zurückgibt, empfängt der Aufrufer eine string. Sowohl der Client als auch der Server senden und empfangen Daten, die ihnen vertraut sind. Andere Typen erfordern keine Konvertierung. Beispielsweise übergibt ein Standardwrapper immer eine 4-Byte-Ganzzahl zwischen verwaltetem und nicht verwaltetem Code, ohne den Typ zu konvertieren.

Marshallen von ausgewählten Schnittstellen

Das Hauptziel des laufzeitaufrufbaren Wrappers (RCW) besteht darin, die Unterschiede zwischen den verwalteten und nicht verwalteten Programmiermodellen auszublenden. Um einen nahtlosen Übergang zu erstellen, verwendet der RCW ausgewählte COM-Schnittstellen, ohne sie dem .NET-Client verfügbar zu machen, wie in der folgenden Abbildung dargestellt.

Die folgende Abbildung zeigt COM-Schnittstellen und den laufzeitaufrufbaren Wrapper:

Screenshot des RCW mit Schnittstellen

Ein RCW, der als früh gebundenes Objekt erstellt wurde, stellt einen bestimmten Typ dar. Es implementiert die Schnittstellen, die das COM-Objekt implementiert und die Methoden, Eigenschaften und Ereignisse aus den Schnittstellen des Objekts verfügbar macht. In der Abbildung macht der RCW die Schnittstelle „INew“ verfügbar, beansprucht jedoch die Schnittstellen IUnknown und IDispatch. Darüber hinaus macht der RCW alle Mitglieder der INew-Schnittstelle für den .NET-Client verfügbar.

Der RCW beansprucht die in der folgenden Tabelle aufgelisteten Schnittstellen, die durch das umschlossene Objekt verfügbar gemacht werden.

Schnittstelle BESCHREIBUNG
IDispatch- Regelt späte Bindung an COM-Objekte durch Reflektion.
IErrorInfo- Stellt eine textbezogene Beschreibung des Fehlers, seiner Quelle, einer Hilfedatei, eines Hilfekontexts und der GUID der Schnittstelle bereit, die den Fehler definiert hat (immer GUID_NULL für .NET-Klassen).
IProvideClassInfo Wenn das eingewickelte COM-Objekt IProvideClassInfo implementiert, extrahiert der RCW die Typinformation aus dieser Schnittstelle, um eine bessere Typidentität zu gewährleisten.
IUnknown Wird für Objektidentität, Typkoersion und Verwaltung der Lebensdauer verwendet:

- Objektidentität
Die Laufzeit unterscheidet zwischen COM-Objekten, indem der Wert der IUnknown-Schnittstelle für jedes Objekt verglichen wird.
- Typkoersion
Der RCW erkennt die dynamische Typermittlung, die von der QueryInterface-Methode ausgeführt wird.
- Lebensdauerverwaltung
Mit der QueryInterface-Methode ruft der RCW einen Verweis auf ein nicht verwaltetes Objekt ab und enthält diesen, bis die Laufzeit die Garbage Collection für den Wrapper ausführt, wodurch das nicht verwaltete Objekt freigegeben wird.

Der RCW beansprucht optional die in der folgenden Tabelle aufgelisteten Schnittstellen, die durch das umschlossene Objekt verfügbar gemacht werden.

Schnittstelle BESCHREIBUNG
IConnectionPoint und IConnectionPointContainer Der RCW konvertiert Objekte, die Ereignisformate für Verbindungspunkte gegenüber delegatbasierten Ereignissen verfügbar machen.
IDispatchEx (nur.NET Framework) Wenn die Klasse IDispatchEx implementiert, implementiert der RCW IExpando. Die IDispatchEx-Schnittstelle ist eine Erweiterung der IDispatch-Schnittstelle. Im Gegensatz zu IDispatch ermöglicht sie das Aufzählen, Hinzufügen, Löschen und Aufrufen von Membern unter Berücksichtigung von Groß-/Kleinschreibung.
IEnumVARIANT Ermöglicht es, dass COM-Typen, die Aufzählungen unterstützen, als Auflistungen behandelt werden können.

Siehe auch