Delen via


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.

Platform invoke

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.

Interop marshalling between managed and unmanaged heaps

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:

Cross-apartment call between a .NET client and COM object

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:

Cross-process marshalling

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.

COM callable wrapper and runtime callable wrapper

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:

SOAP or TcpChannel 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.

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.

Verwijzing

System.Runtime.InteropServices