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 aktivitet vid körning som utförs av den gemensamma språkens exekveringsmiljös marshallingstjä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 motsvarar en enda hanterad typ eller saknad typinformation, till exempel storleken på en matris. För tvetydiga typer tillhandahåller marshaller en standardrepresentation samt alternativa representationer när flera finns. Du kan ange explicita instruktioner till marshallaren om hur man ska hantera den tvetydiga typen.

Platform Invoke- och COM Interop-modeller

Common Language Runtime tillhandahåller två mekanismer för att interoperera 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 anropad, samt 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-interoperabilitetsmetodanropen kan flöda i båda riktningarna.

Plattformsanrop

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-marshallern hanterar data mellan den gemensamma språkens körningshög och den ohanterade högen. Marshalling sker när anroparen och den anropade inte kan arbeta på samma instans av data. Interop-marshallen gör det möjligt för anroparen och mottagaren att verka arbeta med samma data även om de har en egen kopia av denna.

COM har också en marshallare som hanterar data mellan COM-kvarter eller olika COM-processer. När du anropar mellan hanterad och ohanterad kod i samma COM-lägen är interop-marshallern den enda marshallern som är inblandad. När du anropar mellan hanterad kod och ohanterad kod i en annan COM-lägen 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 (verktyget för sammansättningsregistrering) 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. Omkoppling i samma lägenhet.
MTA Both blir MTA. Omkoppling i samma lägenhet.

Eftersom klienten och servern finns i samma miljö hanterar interop marshalling-tjänsten automatiskt all data marshalling. Följande bild visar interop-marshalling-tjänsten som verkar mellan hanterade och ohanterade högar i samma COM-miljö.

Interop-marshalling mellan hanterade och ohanterade högar

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.STAThreadAttribute-egenskapen, System.MTAThreadAttribute-egenskapen, Thread.ApartmentState-egenskapen eller Page.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 dirigeringskraven för kombinationerna.

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

STA
Interop-hantering.

Interop och COM marshalling
STA MTA

STA
Interop och COM marshalling

Interop-hantering.

När en förvaltad klient och en icke-förvaltad server finns i samma lägenhet hanterar interop-marshallingtjä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-anrop mellan en .NET-klient och ett COM-objekt

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

  • Acceptera omkostnaderna för marshalling mellan miljöer, vilket märks bara 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 din C#-klient till exempel anropar många STA COM-komponenter kan du undvika marshalling mellan lägenheter genom att ställa in huvudtråden på STA.

    Anmärkning

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

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

Marshalling av fjärranrop

Precis som med marshallering mellan lägenheter involveras COM-marshalling i varje anrop mellan hanterad och ohanterad kod när objekten befinner sig 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:

Korsprocessbaserad marshalling

Bevara identitet

Den gemensamma 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-anropsbar omslag och runtime-anropsbar omslag

I den här illustrationen:

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

    Anmärkning

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

Antalet processgränser mellan anroparen och den uppringda är irrelevant; samma direkta referens sker för anrop inom och utanför processen.

Hanterad fjärrkommunikation

Körningstiden 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 fungera med en brandvägg mellan de kommunicerande komponenterna, som illustreras i bilden nedan:

SOAP- eller 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.

Titel Beskrivning
Standardbeteende för marshalling Beskriver de regler som interop marshalling-tjänsten använder för att konvertera data.
Hantering av data med Platform Invoke Beskriver hur du deklarerar metodparametrar och skickar argument till funktioner som exporteras av ohanterade bibliotek.
Hantering av data med COM-interop Beskriver hur du anpassar COM-omslutningar för att ändra marshallingsbeteendet.
Gör så här: Migrera Managed-Code DCOM till WCF Beskriver hur du migrerar från DCOM till WCF.
Anvisningar: Kartlägga 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örningsmiljön.
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.

Hänvisning

System.Runtime.InteropServices