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:
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:
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. |