Obálka volatelná za běhu
Modul CLR (Common Language Runtime) zveřejňuje objekty COM prostřednictvím proxy serveru označovaného jako obálka volatelná 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í. Modul runtime udržuje pro každý objekt jeden RCW pro každý proces. Pokud vytvoříte rcW v jedné doméně nebo apartmánu aplikace a pak předáte odkaz na jinou doménu nebo byt aplikace, použije se proxy server k prvnímu objektu. Všimněte si, že tento proxy server je nový spravovaný objekt, a ne stejný jako počáteční analýza RCW; to znamená, že dva spravované objekty nejsou stejné, ale představují stejný objekt MODELU COM. 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:
Pomocí metadat odvozených z knihovny typů vytvoří modul runtime objekt COM, který se volá, i obálku pro daný objekt. Každá analýza RCW udržuje mezipaměť ukazatelů rozhraní na objektu COM, který zabalí a uvolní svůj odkaz na objekt COM, když rcW už není potřeba. Modul runtime provádí uvolňování paměti ve verzi RCW.
Kromě jiných aktivit zařazuje RCW data mezi spravovaným a nespravovaným kódem jménem zabaleného objektu. RcW konkrétně poskytuje zařazová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
do svého spravovaného volajícího, volající obdrží string
znak . Klient i server odesílají a přijímají data, která jsou jim známa. Jiné typy nevyžadují žádný převod. Standardní obálka například vždy předá 4bajtů celé číslo mezi spravovaným a nespravovaným kódem bez převodu typu.
Zařazování vybraných rozhraní
Hlavním cílem volatelného obálky modulu runtime (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 zpřístupňuje klientovi .NET, jak je znázorněno na následujícím obrázku.
Následující obrázek znázorňuje rozhraní MODELU COM a obálku s možností volatelného modulu runtime:
Při vytváření jako objekt s časnou vazbou je RCW konkrétní 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ý zalamuje.
Rozhraní | Popis |
---|---|
Idispatch | Pozdní vazby k objektům MODELU COM prostřednictvím reflexe. |
Ierrorinfo | Poskytuje textový popis chyby, její 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í QueryInterface metoda RCW získá a obsahuje odkaz na nespravovaný objekt, dokud modul runtime neprovede uvolňování paměti obálky, která uvolní nespravovaný objekt. |
RcW volitelně využívá rozhraní uvedená v následující tabulce, která jsou vystavena objektem, který zabalí.
Rozhraní | Popis |
---|---|
I Připojení ionPoint a I Připojení ionPointContainer | Analýza RCW převede objekty, které zpřístupňují styl události spojovacího bodu pro delegované události. |
IDispatchEx (pouze .NET Framework) | Pokud třída implementuje IDispatchEx, RCW implementuje IExpando. IDispatchEx rozhraní je rozšíření IDispatch rozhraní, které, na rozdíl od IDispatch, umožňuje výčtu, přidání, odstranění a rozlišování malých a velkých písmen volání členů. |
IEnumVARIANT | Umožňuje typy modelu COM, které podporují výčet, které se mají považovat za kolekce. |