Sdílet prostřednictvím


Obálka s možností volatelného modulu runtime

Běhové prostředí (Common Language Runtime) zveřejňuje objekty COM prostřednictvím proxy označované jako obálka volání za běhu (RCW). Přestože rcW vypadá jako běžný objekt pro klienty .NET, jeho primární funkcí je zařazování volání mezi klientem .NET a objektem COM.

Modul runtime pro každý objekt COM vytvoří přesně jednu rcW bez ohledu na počet odkazů, které na daném objektu existují. Runtime udržuje jeden RCW pro každý objekt a proces. Pokud vytvoříte RCW v jedné aplikační doméně nebo apartmánu a pak předáte odkaz na jinou aplikační doménu nebo apartmán, použije se proxy pro první objekt. Všimněte si, že tento proxy je nový spravovaný objekt a není stejný jako počáteční RCW; to znamená, že tyto dva spravované objekty nejsou stejné, ale reprezentují stejný COM objekt. Jak ukazuje následující obrázek, libovolný počet spravovaných klientů může obsahovat odkaz na objekty MODELU COM, které zpřístupňují INew a INewer rozhraní.

Následující obrázek znázorňuje proces přístupu k objektům MODELU COM prostřednictvím obálky volatelného modulu runtime:

Proces přístupu k objektům MODELU COM prostřednictvím RCW.

Pomocí metadat odvozených z knihovny typů vytvoří modul runtime objekt COM, který se volá, i obálku pro daný objekt. Každé RCW udržuje mezipaměť ukazatelů na rozhraní objektu COM, který obaluje, a uvolňuje svůj odkaz na objekt COM, když už RCW není potřeba. Modul runtime provádí uvolňování paměti ve verzi RCW.

Kromě jiných aktivit zprostředkovává RCW data mezi spravovaným i nespravovaným kódem pro zabalený objekt. RCW konkrétně poskytuje proces zesílání pro argumenty metody a návratové hodnoty metody vždy, když klient a server mají různé reprezentace dat předávaných mezi nimi.

Standardní obálka vynucuje předdefinovaná pravidla pro řazení. Když například klient .NET předá string typ jako součást argumentu nespravovanému objektu, obálka převede string typ na BSTR typ. Pokud objekt COM vrátí BSTR svému spravovanému volajícímu, volající obdrží string. Klient i server odesílají a přijímají data, která jsou jim známa. Jiné typy nevyžadují žádný převod. Například standardní obal vždy předá 4bajtové celé číslo mezi spravovaným a nespravovaným kódem bez převodu typu.

Zařazování vybraných rozhraní

Hlavním cílem modulu runtime volací obálky (RCW) je skrýt rozdíly mezi spravovanými a nespravovanými programovacími modely. K vytvoření bezproblémového přechodu RCW využívá vybraná rozhraní modelu COM, aniž by je vystavil klientovi .NET, jak je znázorněno na následujícím obrázku.

Následující obrázek znázorňuje rozhraní COM a obálku volatelnou za běhu.

Snímek obrazovky s obálkou volatelnou za běhu s rozhraními

Pokud je RCW vytvořen jako objekt s časnou vazbou, má specifický typ. Implementuje rozhraní, která objekt COM implementuje a zveřejňuje metody, vlastnosti a události z rozhraní objektu. Na obrázku RCW zveřejňuje rozhraní INew, ale využívá rozhraní IUnknown a IDispatch . RcW dále zveřejňuje všechny členy rozhraní INew klientovi .NET.

RCW využívá rozhraní uvedená v následující tabulce, která jsou vystavena objektem, který obaluje.

Rozhraní Popis
IDispatch Pro pozdní vazby k COM objektům prostřednictvím reflexe.
IErrorInfo Poskytuje textový popis chyby, jeho zdroj, soubor nápovědy, kontext nápovědy a identifikátor GUID rozhraní, které definovalo chybu (vždy GUID_NULL pro třídy .NET).
IProvideClassInfo Pokud zabalený objekt COM implementuje IProvideClassInfo, RCW extrahuje informace o typu z tohoto rozhraní, aby poskytovala lepší identitu typu.
IUnknown Pro identitu objektu, převod typů a správu životnosti:

– Identita objektu
Modul runtime rozlišuje mezi objekty COM porovnáním hodnoty rozhraní IUnknown pro každý objekt.
- Převod typu
Analýza RCW rozpozná dynamické zjišťování typů prováděné metodou QueryInterface .
- Správa životnosti
Pomocí metody QueryInterface získá a drží RCW odkaz na nespravovaný objekt, dokud runtime neprovede uvolnění obálky, čímž uvolní nespravovaný objekt.

RCW volitelně využívá rozhraní uvedená v následující tabulce, která jsou vystavena objektem, který obaluje.

Rozhraní Popis
IConnectionPoint a IConnectionPointContainer RCW převádí objekty, které zprostředkovávají styl události spojovacího bodu, na události založené na delegátech.
IDispatchEx (pouze pro .NET Framework) Pokud třída implementuje IDispatchEx, RCW implementuje IExpando. Rozhraní IDispatchEx je rozšířením rozhraní IDispatch, které, na rozdíl od IDispatch, umožňuje výčet, přidání, odstranění a volání členů rozlišující malá a velká písmena.
IEnumVARIANT Umožňuje, aby se typy COM, které podporují výčty, považovaly za kolekce.

Viz také