Sdílet prostřednictvím


Zprostředkování interoperabilních volání

Marshaling v rámci interoperability určuje, jak jsou data předávána v argumentech metody a návratových hodnotách mezi spravovanou a nespravovanou pamětí během volání. Zařazování zprostředkovatele komunikace je aktivita modulu runtime prováděná službou zařazování modulu CLR (Common Language Runtime).

Většina datových typů má běžné reprezentace ve spravované i nespravované paměti. Meziplatformní zprostředkovatel tyto typy zvládá za vás. Jiné typy mohou být nejednoznačné nebo nemusí být vůbec reprezentovány ve spravované paměti.

Nejednoznačný typ může mít buď několik nespravovaných reprezentací, které se mapují na jeden spravovaný typ, nebo chybějící informace o typu, například velikost pole. U nejednoznačných typů poskytuje marshaller výchozí reprezentaci a alternativní reprezentace, kde existuje více reprezentací. Můžete zadat jasné pokyny zprostředkovateli o tom, jak má zpracovat nejednoznačný typ.

Vyvolání platformy a modely spolupráce COM

Modul CLR (Common Language Runtime) poskytuje dva mechanismy pro spolupráci s nespravovaným kódem:

  • Vyvolání platformy, které umožňuje spravovanému kódu volat funkce exportované z nespravované knihovny.
  • Interoperabilita modelu COM, která umožňuje spravovanému kódu pracovat s objekty modelu COM (Component Object Model) prostřednictvím rozhraní.

Platformní volání i COM interoperabilita používají technologii marshalingu pro interoperabilitu k přesnému přesouvání argumentů metody mezi volajícím a volanou a zpět, pokud je to potřeba. Jak ukazuje následující obrázek, volání metody platformy plyne ze spravovaného do nespravovaného kódu a nikdy opačně, s výjimkou případů, kdy jsou zapojeny funkce zpětného volání. I když volání platformy můžou probíhat pouze ze spravovaného do nespravovaného kódu, data mohou proudit oběma směry jako vstupní nebo výstupní parametry. Volání metod COM pro interoperabilitu mohou proudit v obou směrech.

Volání platformy

Na nejnižší úrovni používají oba mechanismy stejnou službu zprostředkování interoperability; některé datové typy jsou však podporovány výhradně prostřednictvím COM interop nebo vyvolání platformy. Podrobnosti naleznete v Výchozí chování při zařazování.

Marshalling a COM apartmány

Zprostředkovatel interoperability zařazuje data mezi haldou „common language runtime“ a nespravovanou haldou. K zařazování dochází vždy, když volající a volaný nemohou pracovat se stejnou instancí dat. Meziprocesorový marshaller umožňuje, aby volající a volaný vypadali, že pracují na stejných datech, i když mají vlastní kopii těchto dat.

Com má také zařazovač, který zařazuje data mezi apartmány COM nebo různými procesy COM. Při volání mezi spravovaným a nespravovaným kódem ve stejném COM bytečku je zprostředkování pomocí maršálování jediné, které se používá. Při volání mezi spravovaným kódem a nespravovaným kódem v jiném apartmánu COM nebo jiným procesem jsou zapojeny jak zprostředkovatele komunikace, tak i zařazovač modelu COM.

Klienti modelu COM a spravované servery

Spravovaný server, který byl exportován a má knihovnu typů registrovanou pomocí nástroje Regasm.exe (Nástroj pro registraci sestavení), má položku registru nastavenou ThreadingModel na Both. Tato hodnota označuje, že server lze aktivovat v apartmánu s jedním vláknem (STA) nebo vícevláknovém apartmánu (MTA). Objekt serveru se vytvoří ve stejném bytě jako jeho volající, jak je znázorněno v následující tabulce:

Klient modelu COM Server .NET Požadavky na organizaci
STA Both se změní na STA. Shodný byt seřaďovací.
MTA Both přemění se na MTA. Shodný byt seřaďovací.

Vzhledem k tomu, že klient a server jsou ve stejné lokalitě, služba pro zprostředkování interoperability automaticky zpracovává všechna data. Následující obrázek znázorňuje službu interop marshalling fungující mezi spravovanými a nespravovanými haldami v rámci stejného COM stylu apartmánu.

Interop marshalling mezi spravovanými a nespravovanými haldami

Pokud plánujete exportovat spravovaný server, mějte na paměti, že klient COM určuje byto serveru. Spravovaný server, který volá klient COM inicializovaný v MTA, musí zajistit bezpečnost vláken.

Spravované klienty a COM servery

Výchozí nastavení spravovaných klientských apartmánů je MTA; Typ aplikace klienta .NET však může změnit výchozí nastavení. Například nastavení klientského apartmánu jazyka Visual Basic je STA. Můžete použít vlastnost System.STAThreadAttribute, vlastnost System.MTAThreadAttribute, vlastnost Thread.ApartmentState nebo vlastnost Page.AspCompatMode k prozkoumání a změně nastavení spravovaného klienta.

Autor komponenty nastaví spřažení vláken serveru COM. Následující tabulka ukazuje kombinace nastavení apartmánu pro klienty .NET a servery COM. Zobrazuje také výsledné požadavky na zařazování pro kombinace.

Klient .NET Server COM Požadavky na organizaci
MTA (výchozí) MTA

STA
Zařazování zprostředkovatele komunikace.

Interoperabilita a zařazování modelu COM.
STA MTA

STA
Interoperabilita a zařazování modelu COM.

Zařazování zprostředkovatele komunikace.

Když je spravovaný klient a nespravovaný server ve stejném bytě, služba zařazování interoperability zpracovává všechna zařazování dat. Pokud se však klient a server inicializují v různých apartmánech, je také vyžadováno COM marshalling. Následující obrázek znázorňuje prvky volání mezi apartmány:

Meziapartmánové volání mezi klientem .NET a objektem COM

Pro vytváření strukturovaného přístupu mezi byty lze provést následující kroky:

  • Přijměte režii maršálování mezi byty, což je zřetelné pouze když dochází k mnoha voláním přes hranici. Chcete-li úspěšně překračovat hranice bytu, je nutné zaregistrovat knihovnu typů komponenty COM.

  • Upravte hlavní vlákno nastavením klientského vlákna na STA nebo MTA. Pokud například klient C# volá mnoho komponent STA COM, můžete se vyhnout zařazování mezi byty nastavením hlavního vlákna na STA.

    Poznámka:

    Jakmile se vlákno klienta C# nastaví na STA, volání MTA komponent COM budou vyžadovat maršálování mezi byty.

Pokyny k explicitnímu výběru modelu bytu najdete v tématu Spravovaná a nespravovaná vlákna.

Příprava vzdálených volání

Tak jako u zařazování mezi byty, je zařazování COM součástí každého volání mezi spravovaným a nespravovaným kódem, kdykoli se objekty nacházejí v samostatných procesech. Například:

  • Klient modelu COM, který používá spravovaný server na vzdáleném hostiteli, využívá distribuované prostředí COM (DCOM).
  • Spravovaný klient, který na vzdáleném hostiteli vyvolá server COM, používá objekt DCOM.

Následující obrázek znázorňuje, jak seřazování zprostředkovatele komunikace a seřazování modelu COM poskytuje komunikační kanály napříč hranicemi procesů a hostitelů:

Přenášení mezi procesy

Zachování identity

Modul CLR (Common Language Runtime) zachovává identitu spravovaných a nespravovaných odkazů. Následující obrázek znázorňuje tok přímých nespravovaných odkazů (horní řádek) a přímých spravovaných odkazů (dolní řádek) napříč hranicemi procesu a hostitele.

volatelný obal a obal volatelný za běhuCOM

Na tomto obrázku:

  • Nespravovaný klient získá odkaz na objekt COM ze spravovaného objektu, který získá tento odkaz ze vzdáleného hostitele. Mechanismus vzdálené komunikace je DCOM.

  • Spravovaný klient získá odkaz na spravovaný objekt z objektu COM, který získá tento odkaz ze vzdáleného hostitele. Mechanismus vzdálené komunikace je DCOM.

    Poznámka:

    Exportovaná knihovna typů spravovaného serveru musí být zaregistrovaná.

Počet hranic procesu mezi volajícím a volaným je irelevantní; stejné přímé odkazování probíhá u volání v rámci procesu i mimo něj.

Spravované vzdálené ovládání

Modul runtime také poskytuje spravovanou komunikaci, kterou můžete použít k vytvoření komunikačního kanálu mezi spravovanými objekty napříč procesem a hranicemi hostitele. Spravované vzdálené připojení může umožňovat bránu firewall mezi komunikujícími komponentami, jak je znázorněno na následujícím obrázku:

SOAP nebo TcpChannelVzdálená volání Vzdálená volání přes brány firewall pomocí protokolu SOAP nebo třídy TcpChannel

Některá nespravovaná volání mohou být směrována prostřednictvím protokolu SOAP, například volání mezi obsluhovanými součástmi a COM.

Titulek Popis
Výchozí chování při marshalling Popisuje pravidla, která používá marshallingová služba pro interoperabilitu k zařazování dat.
Zařazování dat pomocí vyvolání platformy Popisuje, jak deklarovat parametry metody a předávat argumenty funkcím exportovaným nespravovanými knihovnami.
Zařazování dat pomocí COM Interop Popisuje, jak přizpůsobit obaly COM, aby se změnilo chování při zprostředkování.
Postupy: Migrace modelu DCOM Managed-Code do WCF Popisuje, jak migrovat z modelu DCOM na WCF.
Postupy: Mapování HRESULTů a výjimek Popisuje, jak mapovat vlastní výjimky na HRESULT a poskytuje kompletní mapování z každého jednotlivého HRESULT na jeho srovnatelnou třídu výjimek v prostředí .NET Framework.
Spolupráce pomocí obecných typů Popisuje, které akce jsou podporovány při použití obecných typů pro interoperabilitu modelu COM.
Spolupráce s nespravovaným kódem Popisuje služby interoperability poskytované modulem CLR (Common Language Runtime).
Pokročilá interoperabilita modelu COM Poskytuje odkazy na další informace o začlenění komponent MODELU COM do vaší aplikace .NET Framework.
Aspekty návrhu pro spolupráci Obsahuje tipy pro psaní integrovaných komponent modelu COM.

Odkazy

System.Runtime.InteropServices