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.
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 Both
van 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ó.
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:
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:
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ó.
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ó:
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.
Kapcsolódó témakörök
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. |