Interop Marshaling
Interop marshalling bepaalt hoe gegevens worden doorgegeven in methodeargumenten en waarden retourneren tussen beheerd en onbeheerd geheugen tijdens aanroepen. Interop marshalling is een runtimeactiviteit die wordt uitgevoerd door de marshallservice van de common language runtime.
De meeste gegevenstypen hebben algemene weergaven in zowel beheerd als onbeheerd geheugen. De interop marshaller verwerkt deze typen voor u. Andere typen kunnen dubbelzinnig zijn of helemaal niet worden weergegeven in het beheerde geheugen.
Een dubbelzinnig type kan meerdere niet-beheerde weergaven hebben die zijn toegewezen aan één beheerd type of ontbrekende typegegevens, zoals de grootte van een matrix. Voor dubbelzinnige typen biedt de marshaller een standaardweergave en alternatieve representaties waarin meerdere representaties bestaan. U kunt expliciete instructies aan de marshaller geven over hoe het is om een dubbelzinnig type te marshalen.
Platformoproepen en COM-interop-modellen
De algemene taalruntime biedt twee mechanismen voor het samenwerken met onbeheerde code:
- Platformaanroepen, waarmee beheerde code functies kan aanroepen die zijn geëxporteerd uit een niet-beheerde bibliotheek.
- COM-interoperabiliteit, waarmee beheerde code kan communiceren met COM-objecten (Component Object Model) via interfaces.
Zowel platformaanroepen als COM-interop gebruiken interop marshalling om zo nodig methodeargumenten tussen aanroeper en aanroep en terug nauwkeurig te verplaatsen. Zoals u in de volgende afbeelding ziet, stroomt een aanroepmethode van een platform van beheerde naar onbeheerde code en nooit anders, behalve wanneer callback-functies betrokken zijn. Hoewel aanroepen van platformen alleen van beheerde naar onbeheerde code kunnen stromen, kunnen gegevens in beide richtingen stromen als invoer- of uitvoerparameters. Com-interoperabiliteitsmethode-aanroepen kunnen in beide richtingen stromen.
Op het laagste niveau gebruiken beide mechanismen dezelfde interop marshallingdienst; bepaalde gegevenstypen worden echter uitsluitend ondersteund door COM-interoperabiliteit of platform-aanroep. Zie Standaard marshallgedrag voor meer informatie.
Marshalling en COM Apartments
De interop marshaller marshals gegevens tussen de common language runtime heap en de onbeheerde heap. Marshalling vindt plaats wanneer de beller en aanroepen niet op hetzelfde gegevensexemplaren kunnen werken. De interoperabiliteits marshaller maakt het mogelijk dat de beller en de beller op dezelfde gegevens werken, zelfs als ze hun eigen kopie van de gegevens hebben.
COM heeft ook een marshaller die marshals gegevens tussen COM-appartementen of verschillende COM-processen. Bij het aanroepen tussen beheerde en onbeheerde code binnen hetzelfde COM-appartement, is de interop marshaller de enige die betrokken is. Bij het aanroepen tussen beheerde code en onbeheerde code in een ander COM-appartement of een ander proces, zijn zowel de interop marshaller als de COM-marshaller betrokken.
COM-clients en beheerde servers
Een geëxporteerde beheerde server met een typebibliotheek die is geregistreerd door het Regasm.exe (Assembly Registration Tool) heeft een ThreadingModel
registervermelding ingesteld op Both
. Deze waarde geeft aan dat de server kan worden geactiveerd in een sta (single threaded apartment) of een multithreaded appartement (MTA). Het serverobject wordt gemaakt in hetzelfde appartement als de beller, zoals wordt weergegeven in de volgende tabel:
COM-client | .NET-server | Marshallingvereisten |
---|---|---|
STA | Both wordt STA. |
Zelfde appartement marshalling. |
MTA | Both wordt MTA. |
Zelfde appartement marshalling. |
Omdat de client en server zich in hetzelfde appartement bevinden, verwerkt de interop marshalling service automatisch alle gegevens marshalling. In de volgende afbeelding ziet u de interop marshalling service die werkt tussen beheerde en onbeheerde heaps binnen hetzelfde COM-stijl appartement.
Als u van plan bent om een beheerde server te exporteren, moet u er rekening mee houden dat de COM-client het appartement van de server bepaalt. Een beheerde server die wordt aangeroepen door een COM-client die is geïnitialiseerd in een MTA, moet de beveiliging van threads garanderen.
Beheerde clients en COM-servers
De standaardinstelling voor beheerde clientappartementen is MTA; Het toepassingstype van de .NET-client kan echter de standaardinstelling wijzigen. Een Visual Basic-client appartementinstelling is bijvoorbeeld STA. U kunt de System.STAThreadAttribute, de , de System.MTAThreadAttributeThread.ApartmentState eigenschap of de Page.AspCompatMode eigenschap gebruiken om de appartementsinstelling van een beheerde client te onderzoeken en te wijzigen.
De auteur van het onderdeel stelt de threadaffiniteit van een COM-server in. In de volgende tabel ziet u de combinaties van appartementsinstellingen voor .NET-clients en COM-servers. Ook worden de resulterende marshallvereisten voor de combinaties weergegeven.
.NET-client | COM-server | Marshallingvereisten |
---|---|---|
MTA (standaard) | MTA STA |
Interop marshalling. Interop en COM marshalling. |
STA | MTA STA |
Interop en COM marshalling. Interop marshalling. |
Wanneer een beheerde client en onbeheerde server zich in hetzelfde appartement bevinden, verwerkt de interop marshalling-service alle gegevens marshalling. Wanneer client en server echter in verschillende appartementen worden geïnitialiseerd, is COM-marshalling ook vereist. In de volgende afbeelding ziet u de elementen van een oproep tussen appartementen:
Voor marshalling tussen appartementen kunt u het volgende doen:
Accepteer de overhead van de cross-apartment marshalling, wat alleen merkbaar is wanneer er veel oproepen over de grens zijn. U moet de typebibliotheek van het COM-onderdeel registreren voor oproepen om de grens van het appartement te overschrijden.
Wijzig de hoofdthread door de clientthread in te stellen op STA of MTA. Als uw C#-client bijvoorbeeld veel STA COM-onderdelen aanroept, kunt u het marshallen tussen appartementen voorkomen door de hoofdthread in te stellen op STA.
Notitie
Zodra de thread van een C#-client is ingesteld op STA, moeten aanroepen naar MTA COM-onderdelen cross-apartment marshalling vereisen.
Zie Managed and Unmanaged Threading (Managed and Unmanaged Threading) voor instructies over het expliciet selecteren van een appartementsmodel.
Marshalling Remote Calls
Net als bij cross-apartment marshalling wordt COM marshalling betrokken bij elke aanroep tussen beheerde en onbeheerde code wanneer de objecten zich in afzonderlijke processen bevinden. Voorbeeld:
- Een COM-client die een beheerde server op een externe host aanroept, maakt gebruik van gedistribueerde COM (DCOM).
- Een beheerde client die een COM-server op een externe host aanroept, maakt gebruik van DCOM.
In de volgende afbeelding ziet u hoe interop marshalling en COM marshalling communicatiekanalen bieden over proces- en hostgrenzen:
Identiteit behouden
De algemene taalruntime behoudt de identiteit van beheerde en onbeheerde verwijzingen. In de volgende afbeelding ziet u de stroom van directe onbeheerde verwijzingen (bovenste rij) en directe beheerde verwijzingen (onderste rij) over proces- en hostgrenzen.
In deze afbeelding:
Een niet-beheerde client krijgt een verwijzing naar een COM-object van een beheerd object dat deze verwijzing van een externe host ophaalt. Het externe mechanisme is DCOM.
Een beheerde client haalt een verwijzing op naar een beheerd object van een COM-object dat deze verwijzing van een externe host ophaalt. Het externe mechanisme is DCOM.
Notitie
De geëxporteerde typebibliotheek van de beheerde server moet worden geregistreerd.
Het aantal procesgrenzen tussen beller en aanroeper is niet relevant; dezelfde directe verwijzing vindt plaats voor in-proces- en out-of-process-aanroepen.
Beheerde externe toegang
De runtime biedt ook beheerde externe communicatie, die u kunt gebruiken om een communicatiekanaal tot stand te brengen tussen beheerde objecten over proces- en hostgrenzen. Beheerde externe communicatie kan geschikt zijn voor een firewall tussen de communicerende onderdelen, zoals in de volgende afbeelding wordt weergegeven:
Externe aanroepen tussen firewalls met SOAP of de klasse TcpChannel
Sommige onbeheerde oproepen kunnen worden gekanaald via SOAP, zoals de oproepen tussen serviceonderdelen en COM.
Verwante onderwerpen
Title | Beschrijving |
---|---|
Standaard marshallinggedrag | Beschrijft de regels die de interop marshalling-service gebruikt voor marshal data. |
Marshalling Data with Platform Invoke | Beschrijft hoe u methodeparameters declareert en argumenten doorgeeft aan functies die worden geëxporteerd door niet-beheerde bibliotheken. |
Marshalling Data met COM Interop | Hierin wordt beschreven hoe u COM-wrappers aanpast om het marshallgedrag te wijzigen. |
Procedure: Managed-Code DCOM migreren naar WCF | Hierin wordt beschreven hoe u migreert van DCOM naar WCF. |
Procedure: HRESULT's en uitzonderingen toewijzen | Hierin wordt beschreven hoe u aangepaste uitzonderingen toe te wijzen aan HRESULTs en de volledige toewijzing van elke HRESULT aan de vergelijkbare uitzonderingsklasse in .NET Framework biedt. |
Samenwerken met algemene typen | Beschrijft welke acties worden ondersteund bij het gebruik van algemene typen voor COM-interoperabiliteit. |
Samenwerken met onbeheerde code | Hierin worden interoperabiliteitsservices beschreven die worden geleverd door de algemene taalruntime. |
Geavanceerde COM-interoperabiliteit | Bevat koppelingen naar meer informatie over het opnemen van COM-onderdelen in uw .NET Framework-toepassing. |
Ontwerpoverwegingen voor interoperation | Bevat tips voor het schrijven van geïntegreerde COM-onderdelen. |