Dela via


Interop Marshaling

Interop marshalling styr hur data skickas i metodargument och returnerar värden mellan hanterat och ohanterat minne under anrop. Interop marshalling är en körningsaktivitet som utförs av common language runtimes marshalling-tjänst.

De flesta datatyper har vanliga representationer i både hanterat och ohanterat minne. Interop-marshallern hanterar dessa typer åt dig. Andra typer kan vara tvetydiga eller inte alls representeras i hanterat minne.

En tvetydig typ kan ha antingen flera ohanterade representationer som mappas till en enda hanterad typ eller information som saknar typ, till exempel storleken på en matris. För tvetydiga typer tillhandahåller marshaller en standardrepresentation och alternativa representationer där det finns flera representationer. Du kan ange explicita instruktioner till marshaller om hur det är att konvertera en tvetydig typ.

Platform Invoke- och COM Interop-modeller

Den vanliga språkkörningen innehåller två mekanismer för att samverka med ohanterad kod:

  • Plattformsanrop, vilket gör att hanterad kod kan anropa funktioner som exporteras från ett ohanterat bibliotek.
  • COM-interop, som gör att hanterad kod kan interagera med COM-objekt (Component Object Model) via gränssnitt.

Både plattformsanrop och COM-interop använder interop marshalling för att korrekt flytta metodargument mellan anropare och anropare och tillbaka, om det behövs. Som följande bild visar anropar en plattform metodanropsflöden från hanterad till ohanterad kod och aldrig åt andra hållet, förutom när återanropsfunktioner ingår. Även om plattformsanrop endast kan flöda från hanterad till ohanterad kod kan data flöda i båda riktningarna som indata- eller utdataparametrar. COM interop-metodanrop kan flöda i båda riktningarna.

Platform invoke

På den lägsta nivån använder båda mekanismerna samma interop marshalling-tjänst. Vissa datatyper stöds dock uteslutande av COM-interop eller plattformsanrop. Mer information finns i Standardbeteende för marshalling.

Marshalling- och COM-lägenheter

Interop marshaller marshals-data mellan den gemensamma språkkörningshögen och den ohanterade heapen. Marshalling sker när anroparen och anroparen inte kan arbeta på samma instans av data. Interop marshaller gör det möjligt för anroparen och anroparen att verka arbeta med samma data även om de har en egen kopia av data.

COM har också en marshaller som samlar in data mellan COM-lägenheter eller olika COM-processer. När du anropar mellan hanterad och ohanterad kod i samma COM-lägenhet är interop marshaller den enda marshaller som är inblandad. När du anropar mellan hanterad kod och ohanterad kod i en annan COM-lägenhet eller en annan process är både interop marshaller och COM-marshaller inblandade.

COM-klienter och hanterade servrar

En exporterad hanterad server med ett typbibliotek som registrerats av Regasm.exe (assembly registration tool) har en ThreadingModel registerpost inställd på Both. Det här värdet anger att servern kan aktiveras i en enkeltrådad lägenhet (STA) eller en flertrådad lägenhet (MTA). Serverobjektet skapas i samma lägenhet som anroparen, enligt följande tabell:

COM-klient .NET-server Krav för marshalling
STA Both blir STA. Samma lägenhetsr marshalling.
MTA Both blir MTA. Samma lägenhetsr marshalling.

Eftersom klienten och servern finns i samma lägenhet hanterar interop marshalling-tjänsten automatiskt all data marshalling.Because the client and server are in the same apartment, the interop marshalling service automatically handles all data marshalling. Följande bild visar interop marshalling-tjänsten som fungerar mellan hanterade och ohanterade heaps i samma COM-lägenhet.

Interop marshalling between managed and unmanaged heaps

Om du planerar att exportera en hanterad server bör du vara medveten om att COM-klienten avgör serverns lägenhet. En hanterad server som anropas av en COM-klient som initierats i en MTA måste säkerställa trådsäkerheten.

Hanterade klienter och COM-servrar

Standardinställningen för hanterade klientlägenheter är MTA. Programtypen för .NET-klienten kan dock ändra standardinställningen. En Visual Basic-klientlägenhetsinställning är till exempel STA. Du kan använda System.STAThreadAttributeegenskapen , System.MTAThreadAttributeeller Thread.ApartmentStatePage.AspCompatMode egenskapen för att undersöka och ändra lägenhetsinställningen för en hanterad klient.

Komponentens författare anger trådtillhörigheten för en COM-server. I följande tabell visas kombinationerna av lägenhetsinställningar för .NET-klienter och COM-servrar. Den visar också de resulterande marshallingkraven för kombinationerna.

.NET-klient COM-server Krav för marshalling
MTA (standard) MTA

STA
Interop marshalling.

Interop och COM-marshalling.
STA MTA

STA
Interop och COM-marshalling.

Interop marshalling.

När en hanterad klient och ohanterad server finns i samma lägenhet hanterar interop marshalling-tjänsten all data marshalling. Men när klient och server initieras i olika lägenheter krävs com-marshalling också. Följande bild visar elementen i ett anrop mellan lägenheter:

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

För marshalling mellan lägenheter kan du göra följande:

  • Acceptera omkostnaderna för rangering mellan lägenheter, vilket bara är märkbart när det finns många samtal över gränsen. Du måste registrera typbiblioteket för COM-komponenten för att anrop ska kunna passera lägenhetsgränsen.

  • Ändra huvudtråden genom att ställa in klienttråden på STA eller MTA. Om C#-klienten till exempel anropar många STA COM-komponenter kan du undvika rangering mellan lägenheter genom att ställa in huvudtråden på STA.

    Kommentar

    När tråden för en C#-klient har angetts till STA kräver anrop till MTA COM-komponenter mellan lägenheter marshalling.

Anvisningar om hur du uttryckligen väljer en lägenhetsmodell finns i Hanterad och ohanterad trådning.

Fjärrsamtal för marshalling

Precis som med rangering mellan lägenheter är COM-marshalling involverat i varje anrop mellan hanterad och ohanterad kod när objekten finns i separata processer. Till exempel:

  • En COM-klient som anropar en hanterad server på en fjärrvärd använder distribuerad COM (DCOM).
  • En hanterad klient som anropar en COM-server på en fjärrvärd använder DCOM.

Följande bild visar hur interop marshalling och COM-marshalling tillhandahåller kommunikationskanaler över process- och värdgränser:

Cross-process marshalling

Bevara identitet

Den vanliga språkkörningen bevarar identiteten för hanterade och ohanterade referenser. Följande bild visar flödet av direkta ohanterade referenser (översta raden) och direkta hanterade referenser (nedre raden) över process- och värdgränser.

COM callable wrapper and runtime callable wrapper

I den här bilden:

  • En ohanterad klient hämtar en referens till ett COM-objekt från ett hanterat objekt som hämtar den här referensen från en fjärrvärd. Fjärrkommunikationsmekanismen är DCOM.

  • En hanterad klient hämtar en referens till ett hanterat objekt från ett COM-objekt som hämtar den här referensen från en fjärrvärd. Fjärrkommunikationsmekanismen är DCOM.

    Kommentar

    Det exporterade typbiblioteket för den hanterade servern måste vara registrerat.

Antalet processgränser mellan anroparen och anroparen är irrelevant. samma direkta hänvisning sker för process- och out-of-process-anrop.

Hanterad fjärrkommunikation

Körningen tillhandahåller även hanterad fjärrkommunikation, som du kan använda för att upprätta en kommunikationskanal mellan hanterade objekt över process- och värdgränser. Hanterad fjärrkommunikation kan hantera en brandvägg mellan de kommunicerande komponenterna, som följande bild visar:

SOAP or TcpChannel Fjärranrop över brandväggar med SOAP eller klassen TcpChannel

Vissa ohanterade anrop kan kanaliseras via SOAP, till exempel anropen mellan servicekomponenter och COM.

Title Description
Standardbeteende för marshalling Beskriver de regler som interop marshalling-tjänsten använder för att konvertera data.
Samla data med plattformsanrop Beskriver hur du deklarerar metodparametrar och skickar argument till funktioner som exporteras av ohanterade bibliotek.
Marshalling Data med COM Interop Beskriver hur du anpassar COM-omslutningar för att ändra marshallingbeteendet.
Så här migrerar du DCOM med hanterad kod till WCF Beskriver hur du migrerar från DCOM till WCF.
Anvisningar: Mappa HRESULT och undantag Beskriver hur du mappar anpassade undantag till HRESULT och tillhandahåller den fullständiga mappningen från varje HRESULT till dess jämförbara undantagsklass i .NET Framework.
Samverkan med generiska typer Beskriver vilka åtgärder som stöds när du använder generiska typer för COM-samverkan.
Samverka med ohanterad kod Beskriver samverkanstjänster som tillhandahålls av den gemensamma språkkörningen.
Avancerad COM-samverkan Innehåller länkar till mer information om hur du införlivar COM-komponenter i ditt .NET Framework-program.
Designöverväganden för interoperation Innehåller tips för att skriva integrerade COM-komponenter.

Referens

System.Runtime.InteropServices