Share via


Runtime aanroepbare wrapper

De algemene taalruntime maakt COM-objecten beschikbaar via een proxy met de naam runtime callable wrapper (RCW). Hoewel de RCW een gewoon object voor .NET-clients lijkt te zijn, is de primaire functie marshal aanroepen tussen een .NET-client en een COM-object.

De runtime maakt precies één RCW voor elk COM-object, ongeacht het aantal verwijzingen dat op dat object bestaat. De runtime onderhoudt één RCW per proces voor elk object. Als u een RCW in één toepassingsdomein of appartement maakt en vervolgens een verwijzing naar een ander toepassingsdomein of appartement doorgeeft, wordt een proxy naar het eerste object gebruikt. Houd er rekening mee dat deze proxy een nieuw beheerd object is en niet hetzelfde is als de eerste RCW; Dit betekent dat de twee beheerde objecten niet gelijk zijn, maar wel hetzelfde COM-object vertegenwoordigen. Zoals in de volgende afbeelding wordt weergegeven, kan een willekeurig aantal beheerde clients een verwijzing bevatten naar de COM-objecten die beschikbaar worden gemaakt INew en INewer interfaces.

In de volgende afbeelding ziet u het proces voor toegang tot COM-objecten via de runtime aanroepbare wrapper:

Process for accessing COM objects through the RCW.

Met behulp van metagegevens die zijn afgeleid van een typebibliotheek, maakt de runtime zowel het COM-object dat wordt aangeroepen als een wrapper voor dat object. Elke RCW onderhoudt een cache met interfacepointers op het COM-object dat het verpakt en publiceert de verwijzing op het COM-object wanneer de RCW niet meer nodig is. De runtime voert garbagecollection uit op de RCW.

Onder andere activiteiten, de RCW marshals gegevens tussen beheerde en onbeheerde code, namens het verpakte object. De RCW biedt marshalling voor methodeargumenten en methode retourwaarden wanneer de client en server verschillende representaties hebben van de gegevens die ertussen worden doorgegeven.

De standaard wrapper dwingt ingebouwde marshallregels af. Wanneer een .NET-client bijvoorbeeld een string type doorgeeft als onderdeel van een argument aan een onbeheerd object, converteert de wrapper het string naar een BSTR type. Als het COM-object een BSTR aan de beheerde beller retourneert, ontvangt de beller een string. Zowel de client als de server verzenden en ontvangen gegevens die bekend zijn. Voor andere typen is geen conversie vereist. Een standaard-wrapper geeft bijvoorbeeld altijd een geheel getal van 4 byte door tussen beheerde en onbeheerde code zonder het type te converteren.

Marshalling geselecteerde interfaces

Het primaire doel van de runtime callable wrapper (RCW) is het verbergen van de verschillen tussen de beheerde en onbeheerde programmeermodellen. Als u een naadloze overgang wilt maken, verbruikt de RCW geselecteerde COM-interfaces zonder deze beschikbaar te maken voor de .NET-client, zoals wordt weergegeven in de volgende afbeelding.

In de volgende afbeelding ziet u COM-interfaces en de runtime aanroepbare wrapper:

Screenshot of the runtime callable wrapper with interfaces.

Bij het maken als een vroeg gebonden object is de RCW een specifiek type. Hiermee worden de interfaces geïmplementeerd die door het COM-object worden geïmplementeerd en worden de methoden, eigenschappen en gebeurtenissen van de interfaces van het object weergegeven. In de afbeelding maakt de RCW de INew-interface beschikbaar, maar gebruikt de IUnknown - en IDispatch-interfaces . Verder maakt de RCW alle leden van de INew-interface beschikbaar voor de .NET-client.

De RCW gebruikt de interfaces die worden vermeld in de volgende tabel, die worden weergegeven door het object dat wordt verpakt.

Interface Beschrijving
Idispatch Voor late binding met COM-objecten via weerspiegeling.
IErrorInfo Biedt een tekstuele beschrijving van de fout, de bron, een Help-bestand, de Help-context en de GUID van de interface die de fout heeft gedefinieerd (altijd GUID_NULL voor .NET-klassen).
IProvideClassInfo Als het COM-object dat wordt verpakt IProvideClassInfo implementeert, extraheert de RCW de typegegevens uit deze interface om een betere typeidentiteit te bieden.
Iunknown Voor objectidentiteit typt u dwang en levensduurbeheer:

- Objectidentiteit
De runtime maakt onderscheid tussen COM-objecten door de waarde van de IUnknown-interface voor elk object te vergelijken.
- Type coercion
De RCW herkent de dynamische typedetectie die wordt uitgevoerd door de QueryInterface-methode .
- Levensduurbeheer
Met behulp van de QueryInterface-methode haalt de RCW een verwijzing op naar een onbeheerd object totdat de runtime garbagecollection uitvoert op de wrapper, waardoor het onbeheerde object wordt vrijgegeven.

De RCW verbruikt optioneel de interfaces die worden vermeld in de volgende tabel, die worden weergegeven door het object dat wordt verpakt.

Interface Beschrijving
I Verbinding maken ionPoint en I Verbinding maken ionPointContainer De RCW converteert objecten die de verbindingspuntgebeurtenisstijl beschikbaar maken voor gebeurtenissen op basis van gedelegeerden.
IDispatchEx (alleen.NET Framework) Als de klasse IDispatchEx implementeert, implementeert de RCW IExpando. De IDispatchEx-interface is een uitbreiding van de IDispatch-interface die, in tegenstelling tot IDispatch, opsomming, toevoeging, verwijdering en hoofdlettergevoelige aanroepen van leden mogelijk maakt.
IEnumVARIANT Hiermee kunnen COM-typen die ondersteuning bieden voor opsommingen worden behandeld als verzamelingen.

Zie ook