Delen via


Interop Marshaling

Interop marshalling bepaalt hoe gegevens worden doorgegeven in methodeargumenten en geretourneerde waarden tussen beheerd en onbeheerd geheugen tijdens aanroepingen. 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.

Platformaanroepen en COM-interoperabiliteitsmodellen

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, indien nodig, methodeargumenten nauwkeurig tussen aanroeper en ontvanger heen en weer 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-interop-methodeaanroepen kunnen in beide richtingen worden uitgevoerd.

Platform invoke

Op het laagste niveau gebruiken beide mechanismen dezelfde interop marshallingdienst; bepaalde datatypes worden echter uitsluitend ondersteund door COM interop of platform-invoke. Voor details, zie Default Marshalling Behavior.

Marshalling en COM Apartments

De interoperabiliteitsmarshaler verwerkt gegevens tussen de common language runtime heap en de onbeheerde heap. Marshalling vindt plaats wanneer de beller en de aangeroepene niet op hetzelfde gegevensvoorbeeld kunnen werken. De interop-marshaller maakt het mogelijk dat de beller en de ontvanger lijkt alsof ze op dezelfde gegevens werken, zelfs als ze hun eigen kopie van de gegevens hebben.

COM heeft ook een marshaller die gegevens overdraagt tussen COM-componenten 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 MTA (multithreaded apartment). 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. Coördinatie binnen hetzelfde appartement.
MTA Both wordt MTA. Coördinatie binnen hetzelfde appartement.

Omdat de client en server zich in hetzelfde appartement bevinden, verzorgt de interoperabiliteitsmarshallingsdienst automatisch de gehele verwerking van de gegevens. In de volgende afbeelding ziet u de interop marshalling service die werkt tussen beheerde en onbeheerde heaps binnen hetzelfde COM-stijl appartement.

Interop marshalling tussen beheerde en onbeheerde hoop

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-clientinstelling voor appartementsmodus is bijvoorbeeld STA. U kunt de System.STAThreadAttribute-, de System.MTAThreadAttribute-, de Thread.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-marshallingservice 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 oproep tussen een .NET-client en COM-object

Voor marshalling tussen appartementen kunt u het volgende doen:

  • Aanvaard de overhead van de cross-apartment marshalling, die alleen merkbaar is wanneer er veel oproepen over de grens plaatsvinden. U moet de COM-componentbibliotheek registreren zodat oproepen succesvol de grenzen van de woning kunnen 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.

    Opmerking

    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.

Afhandelen van Remote Oproepen

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:

Marshalling tussen processen

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-aanroepbare wrapper en runtime-aanroepbare 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 mechanisme voor afstandsbediening 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 mechanisme voor afstandsbediening is DCOM.

    Opmerking

    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 bediening

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 of TcpChannel Externe oproepen via firewalls met behulp van SOAP of de TcpChannel-klasse

Sommige onbeheerde oproepen kunnen worden gekanaald via SOAP, zoals de oproepen tussen serviceonderdelen en COM.

Titel Beschrijving
Standaard marshallinggedrag Beschrijft de regels die de interop marshalling-service gebruikt om gegevens te marshallen.
Gegevens samenstellen met Platform Invoke Beschrijft hoe u methodeparameters declareert en argumenten doorgeeft aan functies die worden geëxporteerd door niet-beheerde bibliotheken.
Verwerken van Gegevens 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 aangepaste uitzonderingen aan HRESULTs kunnen worden toegewezen en biedt de volledige toewijzing van elke HRESULT aan de vergelijkbare uitzonderingsklasse in de .NET Framework.
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.

Referentie

System.Runtime.InteropServices