Zařazování spolupráce

Zařazování zprostředkovatele řízení způsobu předávání dat v argumentech metody a vrácení hodnot mezi spravovanou a nespravovanou pamětí během volání. Zařazování spolupráce je aktivita běhu 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. Tento typ za vás zvládá zprostředkovatele komunikace. 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 explicitní pokyny pro marshaller o tom, jak se má zařaďovat nejednoznačný typ.

Volání platformy a modely zprostředkovatele komunikace modelu 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í.

Volání platformy i zprostředkovatele komunikace modelu COM používají k přesnému přesouvání argumentů metody mezi volajícím a volanou a zpět v případě potřeby. Jak ukazuje následující obrázek, volání metody volání platformy ze spravovaného do nespravovaného kódu a nikdy jiným způsobem, s výjimkou případů, kdy jsou zapojeny funkce zpětného volání. I když volání volání platformy můžou tokovat pouze ze spravovaného kódu do nespravovaného kódu, data můžou proudit oběma směry jako vstupní nebo výstupní parametry. Volání zprostředkovatele komunikace modelu COM můžou proudit v obou směrech.

Platform invoke

Na nejnižší úrovni používají oba mechanismy stejnou službu zařazování spolupráce; Některé datové typy jsou však podporovány výhradně voláním zprostředkovatele komunikace com nebo platformy. Podrobnosti najdete v tématu Výchozí chování při zařazování.

Zařazování a kom apartmány

Zařazování zprostředkovatele komunikace zařazuje data mezi haldou common language runtime a nespravovanou haldou. K zařazování dochází vždy, když volající a volaný nemůže pracovat se stejnou instancí dat. Zprostředkovatele komunikace je možné, aby volající a volaný fungoval na stejných datech, i když má vlastní kopii 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 apartmánu COM je jediným zařazovačem zprostředkovatele komunikace. 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

Exportovaný spravovaný server s knihovnou typů zaregistrovanou nástrojem 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 seřazování
STA Both se změní na STA. Shodný byt seřaďovací.
MTA Both se změní na MTA. Shodný byt seřaďovací.

Vzhledem k tomu, že klient a server jsou ve stejném bytě, služba zařazování zprostředkovatele komunikace automaticky zpracovává všechna zařazování dat. Následující obrázek znázorňuje službu zařazování spolupráce mezi spravovanými a nespravovanými haldy v rámci stejného apartmánu ve stylu MODELU COM.

Interop marshalling between managed and unmanaged heaps

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

Spravovaní klienti a servery MODELU COM

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 System.STAThreadAttributevlastnost , System.MTAThreadAttributeThread.ApartmentState vlastnost nebo Page.AspCompatMode vlastnost k prozkoumání a změně nastavení bytu 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 seřazování
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 vyžadováno také zařazování modelu COM. Následující obrázek znázorňuje prvky volání mezi apartmány:

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

Pro zařazování křížového bytu můžete provést následující:

  • Přijměte režii zařazování křížového bytu, což je patrné pouze v případě, že přes hranice existuje mnoho volání. 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 je vlákno klienta C# nastaveno na STA, volání komponent MODELU COM MTA bude vyžadovat zařazování mezi byty.

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

Zařazování vzdálených volání

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

  • Klient modelu COM, který vyvolá spravovaný server na vzdáleném hostiteli, používá distribuovaný objekt 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ů:

Cross-process marshalling

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.

COM callable wrapper and runtime callable wrapper

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 volanou je irelevantní; Stejné přímé odkazování probíhá u volání v procesu a mimo proces.

Spravovaná komunikace

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á komunikace může obsahovat bránu firewall mezi komunikujícími komponentami, jak ukazuje následující obrázek:

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

Některá nespravovaná volání mohou být kanálována prostřednictvím protokolu SOAP, například volání mezi obsluhovanými komponentami a com.

Titulek Popis
Výchozí chování při zařazování Popisuje pravidla, která služba zařazování zprostředkovatele komunikace používá 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í zprostředkovatele komunikace modelu COM Popisuje, jak přizpůsobit obálky MODELU COM tak, aby se změnilo chování při zařazování.
Postup: Migrace spravovaného kódu DCOM do WCF Popisuje, jak migrovat z modelu DCOM na WCF.
Postupy: Mapování výsledků HRESULT a výjimek Popisuje, jak mapovat vlastní výjimky na HRESULTs a poskytuje kompletní mapování z každého HRESULT na jeho srovnatelnou třídu výjimek v rozhraní .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.

Reference

System.Runtime.InteropServices