Megosztás a következőn keresztül:


Interop Marshaling

Az interop-rendezés szabályozza az adatok metódusargumentumokban való átadását, valamint a felügyelt és a nem felügyelt memória közötti értékeket a hívások során. Az interop-rendezés a közös nyelvi futtatókörnyezet rendezési szolgáltatása által végrehajtott futásidejű tevékenység.

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ípus több nem felügyelt ábrázolást is tartalmazhat, amelyek egyetlen felügyelt típusra vannak leképezve, vagy hiányzó típusinformációkkal, például egy tömb méretével. 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 interop 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-rendezés használatával pontosan mozgatja a metódusargumentumokat a hívó és a hívó 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 bármelyik irányba haladhatnak.

Platform invoke

A legalacsonyabb szinten mindkét mechanizmus ugyanazt az interop marshalling szolgáltatást használja; bizonyos adattípusokat azonban kizárólag com-interop vagy platformhívások támogatnak. További részletekért lásd az alapértelmezett rendezési viselkedést.

Rendező és COM Apartmanok

Az interop marshaller marshals data between the common language runtime heap and unmanaged heap. A rendezés akkor történik, ha a hívó és a hívó nem tud ugyanazon az adatpéldányon működni. Az interop marshaller lehetővé teszi, hogy a hívó és a hívó úgy tűnjön, hogy ugyanazon az adatokon működik, még akkor is, ha saját másolatuk van az adatokról.

A COM egy olyan rendezővel is rendelkezik, amely adatokat hoz létre a COM-lakások 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 felügyelt kód és a nem felügyelt kód közötti hívás egy másik COM-lakásban vagy egy másik folyamatban történik, az interop marshaller és a COM-rendező is érintett.

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 felügyelt kiszolgáló beállításjegyzék-bejegyzése a következőre Bothvan ThreadingModel á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ó Rendezési követelmények
STA Both sta-ra változik. Egylakásos rendezés.
MTA Both MTA lesz. Egylakásos rendezés.

Mivel az ügyfél és a kiszolgáló ugyanabban a lakásban található, az interop marshalling szolgáltatás automatikusan kezeli az összes adatrendezé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 marshalling between managed and unmanaged heaps

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 System.STAThreadAttributea, 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ó rendezési követelményeket is megjeleníti.

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

STA
Interop-rendezés.

Interop és COM rendezés.
STA MTA

STA
Interop és COM rendezés.

Interop-rendezés.

Ha egy felügyelt ügyfél és a nem felügyelt kiszolgáló ugyanabban a lakásban van, az interop marshalling szolgáltatás kezeli az összes adatrendezést. Ha azonban az ügyfél és a kiszolgáló inicializálása különböző apartmanokban történik, com-rendezésre is szükség van. Az alábbi ábra egy lakásközi hívás elemeit mutatja be:

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

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 a lakáshatár sikeres átlépéséhez.

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

    Feljegyzés

    Ha a C#-ügyfél szála STA-ra van állítva, az MTA COM-összetevőkre irányuló hívásokhoz lakásközi rendezé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élda:

  • 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 com-kiszolgálót hív meg egy távoli gazdagépen, a DCOM-t használja.

Az alábbi ábra bemutatja, hogyan biztosít kommunikációs csatornákat az interop-rendezés és a COM-rendezés a folyamatok és a gazdagépek határán:

Cross-process marshalling

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 callable wrapper and runtime callable wrapper

Ebben az ábrán:

  • A nem felügyelt ügyfél egy felügyelt objektumból kap egy COM-objektumra mutató hivatkozást, amely ezt a hivatkozást távoli gazdagépről szerzi be. Az újraegyensúlyozási mechanizmus 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. Az újraegyensúlyozási mechanizmus a DCOM.

    Feljegyzé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 újraküldés

A futtatókörnyezet felügyelt újraegyeztetést is biztosít, amellyel kommunikációs csatornát hozhat létre a felügyelt objektumok között a folyamat és az állomáshatárok között. A felügyelt remoting képes tűzfalat elhelyezni a kommunikáló összetevők között, ahogy az alábbi ábrán látható:

SOAP or 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ó: Felügyelt kódú 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 összehasonlítható kivételosztályához.
Ü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-keretrendszer alkalmazá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.

Referencia

System.Runtime.InteropServices