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 .NET-Clients einen RCW als normales Objekt betrachten, besteht seine primäre Funktion im Marshallen von Aufrufen zwischen einem .NET-Client und einem COM-Objekt.

Die Common Language Runtime erstellt genau einen RCW für jedes COM-Objekt, unabhängig von der Anzahl der vorhandenen Verweise auf das Objekt. Die Common Language Runtime verwaltet für jedes Objekt einen einzelnen RCW pro Prozess. Wenn Sie einen RCW in einer Anwendungsdomäne oder einem Apartment erstellen und anschließend einen Verweis an eine andere Anwendungsdomäne oder ein anderes Apartment übergeben, wird ein Proxy für das erste Objekt verwendet. Beachten Sie, dass es sich bei diesem Proxy um ein neues verwaltetes Objekt handelt, das nicht mit dem ursprünglichen RCW identisch ist. Dies bedeutet, dass die beiden verwalteten Objekte nicht gleich sind, aber trotzdem dasselbe COM-Objekt darstellen. Wie die folgende Abbildung zeigt, kann eine beliebige Anzahl verwalteter Clients auf die COM-Objekte verweisen, die die Schnittstellen INew und INewer verfügbar machen.

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

Process for accessing COM objects through the RCW.

Mithilfe von Metadaten, die aus einer Typbibliothek abgeleitet werden, erstellt die Common Language Runtime sowohl das aufzurufende COM-Objekt als auch einen Wrapper für dieses Objekt. Jeder RCW verwaltet einen Cache von Schnittstellenzeigern auf das umschlossene COM-Objekt. Ist der RCW nicht länger erforderlich, wird der jeweilige Verweis auf das COM-Objekt freigegeben. Die Common Language Runtime führt eine Garbage Collection für den RCW durch.

Unter anderem marshallt der RCW für das umschlossene Objekt Daten zwischen verwaltetem und nicht verwaltetem Code. Insbesondere marshallt der RCW Argumente und Rückgabewerte von Methoden, wenn der Client und der Server die untereinander ausgetauschten Daten unterschiedlich darstellen.

Der Standardwrapper erzwingt integrierte Marshallregeln. Wenn beispielsweise ein .NET-Client einen string-Typ als Teil eines Arguments an ein nicht verwaltetes Objekt übergibt, konvertiert der Wrapper den string-Typ in einen BSTR-Typ. Gibt das COM-Objekt seinem verwalteten Aufrufer einen BSTR-Typ zurück, erhält der Aufrufer einen string-Typ. Sowohl der Client als auch der Server senden und empfangen auf diese Weise Daten, die ihnen jeweils vertraut sind. Andere Typen erfordern keine Konvertierung. Ein Standardwrapper überträgt z. B. eine ganze Zahl von 4 Byte zwischen verwaltetem und nicht verwaltetem Code immer ohne Typkonvertierung.

Marshallen von ausgewählten Schnittstellen

Die Hauptaufgabe des RCW (Runtime Callable Wrapper) besteht darin, die Unterschiede zwischen den verwalteten und nicht verwalteten Programmiermodellen unsichtbar zu machen. Um einen nahtlosen Übergang zu gewährleisten, beansprucht der RCW ausgewählte COM-Schnittstellen, ohne diese für den .NET-Client verfügbar zu machen. Dies ist in der folgenden Abbildung dargestellt.

Die folgende Abbildung zeigt COM-Schnittstellen und den RCW:

Screenshot of the runtime callable wrapper with interfaces.

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

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

Interface Beschreibung
IDispatch Regelt späte Bindung an COM-Objekte durch Reflektion.
IErrorInfo Stellt eine Textbeschreibung des Fehlers und der Fehlerquelle, eine Hilfedatei, den Hilfekontext und die GUID der Schnittstelle bereit, die den Fehler definiert hat (bei .NET-Klassen immer GUID_NULL).
IProvideClassInfo Wenn das COM-Objekt, das umschlossen wird, IProvideClassInfo implementiert, extrahiert der RCW die Typinformationen über diese Schnittstelle, um eine bessere Typidentität bereitzustellen.
IUnknown Wird für Objektidentität, Typkoersion und Verwaltung der Lebensdauer verwendet:

- Objektidentität
Die Common Language Runtime unterscheidet zwischen COM-Objekten, indem der Wert der Schnittstelle IUnknown für jedes Objekt verglichen wird.
- Typkoersion
Der RCW erkennt die dynamische Typermittlung durch die Methode QueryInterface.
- Verwaltung der Lebensdauer
Mithilfe der Methode QueryInterface erhält der RCW einen Verweis auf ein nicht verwaltetes Objekt und hält diesen aufrecht, bis die Common Language Runtime eine Garbage Collection auf den Wrapper durchführt. Dadurch wird das nicht verwaltete Objekt freigegeben.

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

Interface 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 Aktiviert COM-Typen, die die Behandlung von Enumerationen als Auflistungen unterstützen.

Siehe auch