Megosztás:


Interop Marshaling

Az interop marshalling szabályozza az adatok átadását metódusargumentumokon keresztül, valamint az értékek átvitelét a felügyelt és nem felügyelt memória között hívások során. Az interop-rendezés olyan futtatókörnyezeti tevékenység, amelyet a közös nyelvi futtatókörnyezet rendezési szolgáltatása hajt végre.

A legtöbb adattípus közös ábrázolásokkal rendelkezik mind a felügyelt, mind a nem felügyelt memóriában. Az interop marshaller kezeli ezeket a típusokat az Ön számára. Más típusok nem egyértelműek vagy egyáltalán nem jelölhetők a felügyelt memóriában.

Egy nem egyértelmű típusnak lehet több nem felügyelt reprezentációja, amelyek egyetlen felügyelt típusra leképeződnek, vagy hiányozhatnak típusinformációk, például egy tömb mérete. Kétértelmű típusok esetén a rendező alapértelmezett és alternatív reprezentációkat biztosít, ahol több reprezentáció is létezik. Explicit utasításokat adhat meg a rendezőnek arról, hogyan lehet egy nem egyértelmű típust létrehozni.

Platformhívás és COM interoperációs modellek

A közös nyelvi futtatókörnyezet két mechanizmust biztosít a nem felügyelt kódokkal való együttműködéshez:

  • Platformhívás, amely lehetővé teszi, hogy a felügyelt kód meghívja a nem felügyelt kódtárból exportált függvényeket.
  • COM-interop, amely lehetővé teszi, hogy a felügyelt kód interfészeken keresztül kommunikáljon a komponensobjektum-modell (COM) objektumaival.

A platformhívás és a COM-interop egyaránt az interop marshalizás használatával pontosan mozgatja a metódusargumentumokat a hívó és a hívott között, ha szükséges. Ahogy az alábbi ábrán látható, a platform meghívja a metódushívási folyamatokat felügyeltről nem felügyelt kódra, és soha nem fordítva, kivéve, ha a visszahívási függvények is részt vesznek. Annak ellenére, hogy a platformhívási hívások csak felügyelt kódból nem felügyelt kódba áramolhatnak, az adatok mindkét irányban áramolhatnak bemeneti vagy kimeneti paraméterként. A COM interop metódushívások két irányban haladhatnak.

Platformmeghívó

A legalacsonyabb szinten mindkét mechanizmus ugyanazt az interop marshalling szolgáltatást használja; vannak olyan adattípusok, amelyeket kizárólag a COM-interop vagy platform-meghívások támogatnak. További részletekért lásd az alapértelmezett marshalling viselkedést.

Marshallolás és COM objektumok

Az interop marshaller az adatokat a közös nyelvi futtatókörnyezet szemétterület és a nem kezelt szemétterület között közvetíti. A szerializálás akkor történik, ha a hívó és a hívott nem tud ugyanazon az adatpéldányon dolgozni. Az interop marshaller lehetővé teszi, hogy a hívó és a hívott úgy tűnjön, mintha ugyanazon az adaton dolgoznának, még akkor is, ha mindkettő saját másolatát használja az adatokból.

A COM egy olyan összekötővel is rendelkezik, amely adatokat küld át a COM-rekeszek vagy a különböző COM-folyamatok között. Ha a felügyelt és a nem felügyelt kód közötti hívás ugyanazon a COM-lakáson belül történik, az interop marshaller az egyetlen közreműködő. Ha a kezelt és nem kezelt kódok között egy másik COM-apartban vagy egy másik folyamatban történik a hívás, mind az interop marshaller, mind a COM-marshaller részt vesz.

COM-ügyfelek és felügyelt kiszolgálók

A Regasm.exe (szerelvényregisztrációs eszköz) által regisztrált típustárral rendelkező exportált kezelt kiszolgáló beállításjegyzék-bejegyzése ThreadingModelBoth értékre van állítva. Ez az érték azt jelzi, hogy a kiszolgáló egyszálas lakásban (STA) vagy többszálú lakásban (MTA) aktiválható. A kiszolgálóobjektum ugyanabban a lakásban jön létre, mint a hívó, ahogy az alábbi táblázatban látható:

COM-ügyfél .NET-kiszolgáló Marshaling követelmények
STA Both sta-ra változik. Egylakásos rendezés.
MTA Both MTA lesz. Egylakásos rendezés.

Mivel a kliens és a szerver ugyanabban a lakásban található, az interop marshalling szolgáltatás automatikusan kezeli az összes adattovábbítást. Az alábbi ábrán az egyazon COM-stílusú lakás felügyelt és nem felügyelt halomai között működő interop marshalling szolgáltatás látható.

Interop adatmarshalling kezelt és nem kezelt halmazok között

Ha felügyelt kiszolgáló exportálását tervezi, vegye figyelembe, hogy a COM-ügyfél határozza meg a kiszolgáló lakását. Az MTA-ban inicializált COM-ügyfél által hívott felügyelt kiszolgálónak biztosítania kell a szál biztonságát.

Felügyelt ügyfelek és COM-kiszolgálók

A felügyelt ügyféllakások alapértelmezett beállítása az MTA; azonban a .NET-ügyfél alkalmazástípusa módosíthatja az alapértelmezett beállítást. A Visual Basic-ügyfél lakásbeállítása például sta. A felügyelt ügyfél lakásbeállításainak vizsgálatához és módosításához használhatja a System.STAThreadAttribute, a System.MTAThreadAttribute, a Thread.ApartmentState tulajdonságot vagy a Page.AspCompatMode tulajdonságot.

Az összetevő szerzője beállítja egy COM-kiszolgáló szál affinitását. Az alábbi táblázat a .NET-ügyfelek és COM-kiszolgálók lakásbeállításainak kombinációit mutatja be. A kombinációkhoz tartozó elosztási követelményeket is megjeleníti.

.NET-ügyfél COM-kiszolgáló Marshaling követelmények
MTA (alapértelmezett) MTA

STA
Interop-rendezés.

Interop és COM marshalling.
STA MTA

STA
Interop és COM marshalling.

Interop-rendezés.

Amikor egy felügyelt ügyfél és egy nem felügyelt kiszolgáló ugyanabban a helyiségben van, az interop marshalling szolgáltatás kezeli az összes adatrendezést. Ha azonban az ügyfél és a kiszolgáló különböző apartmanokban van inicializálva, a COM marshalingra is szükség van. Az alábbi ábra egy lakásközi hívás elemeit mutatja be:

Lakásközi hívás .NET-ügyfél és COM-objektum között

Lakásközi rendezéshez a következőket teheti:

  • Fogadja el a lakásközi rendezés többletterhelését, ami csak akkor észlelhető, ha sok hívás van a határon. Regisztrálnia kell a COM-összetevő típuskönyvtárát, hogy a hívások sikeresen átléphessék a környezet határait.

  • Módosítsa a fő szálat úgy, hogy az ügyfélszálat STA vagy MTA értékre állítja. Ha például a C#-ügyfél számos STA COM-összetevőt hív meg, elkerülheti a lakásközi rendezést, ha a fő szálat STA-ra állítja.

    Megjegyzés:

    Ha egy C#-kliens szála STA-ra van állítva, az MTA típusú COM-összetevőkre irányuló hívásokhoz lakásközi kiszolgálás szükséges.

A lakásmodellek explicit kiválasztásával kapcsolatos utasításokért lásd: Felügyelt és nem felügyelt szálkezelés.

Távoli hívások átirányítása

A lakásközi rendezéshez hasonlóan a COM-rendezés is részt vesz minden hívásban a felügyelt és a nem felügyelt kód között, amikor az objektumok külön folyamatokban találhatók. Például:

  • A távoli gazdagépen felügyelt kiszolgálót meghívó COM-ügyfél elosztott COM -t (DCOM) használ.
  • Egy felügyelt ügyfél, amely egy COM-kiszolgálót hív meg egy távoli gazdagépen, DCOM-t használ.

Az alábbi ábra bemutatja, hogyan biztosítanak kommunikációs csatornákat az interop marshalling és a COM marshalling a folyamatok és a gazdagépek határain:

Folyamatközi kiszolgálás

Identitás megőrzése

A közös nyelvi futtatókörnyezet megőrzi a felügyelt és nem felügyelt hivatkozások identitását. Az alábbi ábrán a közvetlen nem felügyelt hivatkozások (felső sor) és a közvetlen felügyelt hivatkozások (alsó sor) folyamat- és állomáshatárok közötti áramlása látható.

COM interfész burkoló és futásidejű interfész burkoló

Ebben az ábrán:

  • A nem felügyelt ügyfél egy felügyelt objektumtól kap egy COM-objektumra mutató hivatkozást, amely ezt a hivatkozást egy távoli gazdagépről szerzi be. A távoli elérés mechanizmusa a DCOM.

  • A felügyelt ügyfelek egy COM-objektumból kapnak egy felügyelt objektumra mutató hivatkozást, amely egy távoli gazdagépről szerzi be ezt a hivatkozást. A távoli elérés mechanizmusa a DCOM.

    Megjegyzés:

    A felügyelt kiszolgáló exportált típustárát regisztrálni kell.

A hívó és a hívó közötti folyamathatárok száma irreleváns; ugyanez a közvetlen hivatkozás történik a folyamatban lévő és a folyamaton kívüli hívások esetében is.

Felügyelt távoli elérés

A futtatókörnyezet felügyelt távoli elérést is biztosít, amellyel kommunikációs csatornát hozhat létre a felügyelt objektumok között a folyamat- és állomáshatárokon át. A kezelt távoli kommunikáció tűzfal jelenlétében is képes működni a kommunikáló összetevők között, ahogy az alábbi ábrán látható.

SOAP vagy TcpChannel Távoli hívások tűzfalakon a SOAP vagy a TcpChannel osztály használatával

Egyes nem felügyelt hívások a SOAP-on keresztül csatornázhatók, például a szervizelt összetevők és a COM közötti hívások.

Cím Leírás
Alapértelmezett rendezési viselkedés Azokat a szabályokat ismerteti, amelyeket az interop marshalling szolgáltatás az adatok marshalásához használ.
Adatok rendezése platformhívással Ismerteti, hogyan deklarálhat metódusparamétereket, és hogyan adhat át argumentumokat a nem felügyelt kódtárak által exportált függvényeknek.
Adatok rendezése a COM Interop használatával Ismerteti, hogyan szabhatja testre a COM-burkolókat a rendezési viselkedés módosítása érdekében.
Útmutató: Managed-Code DCOM migrálása WCF-be Ismerteti, hogyan migrálhat a DCOM-ból a WCF-be.
Útmutató: HRESULT-ok és kivételek leképezése Ismerteti, hogyan képezhet le egyéni kivételeket a HRESULT-ekre, és hogyan biztosít teljes leképezést az egyes HRESULT-okból a .NET-keretrendszer hasonló kivételosztályára.
Üzemeltetés általános típusok használatával Ismerteti, hogy mely műveletek támogatottak a COM-együttműködés általános típusainak használatakor.
Nem felügyelt kóddal való együttműködés A közös nyelvi futtatókörnyezet által biztosított együttműködési szolgáltatásokat ismerteti.
Speciális COM-együttműködés A COM-összetevők .NET-keretrendszeralkalmazásba való beépítésével kapcsolatos további információkra mutató hivatkozásokat tartalmaz.
Az együttműködés tervezési szempontjai Tippek az integrált COM-összetevők írásához.

Referenciák

System.Runtime.InteropServices