Wywoływana otoka środowiska uruchomieniowego

Środowisko uruchomieniowe języka wspólnego uwidacznia obiekty COM za pośrednictwem serwera proxy nazywanego otoką wywoływaną przez środowisko uruchomieniowe (RCW). Chociaż RCW wydaje się być zwykłym obiektem dla klientów platformy .NET, jej podstawową funkcją jest przeprowadzanie marshalingu wywołań między klientem platformy .NET a obiektem COM.

Środowisko uruchomieniowe tworzy dokładnie jedną RCW dla każdego obiektu COM, niezależnie od liczby odwołań, które istnieją w tym obiekcie. Środowisko uruchomieniowe utrzymuje jeden RCW na proces dla każdego obiektu. Jeśli tworzysz RCW w jednej domenie aplikacji lub mieszkaniu, a następnie przekazujesz odwołanie do innej domeny aplikacji lub mieszkania, zostanie użyty serwer proxy do pierwszego obiektu. Należy pamiętać, że ten serwer proxy jest nowym obiektem zarządzanym, a nie tym samym co początkowy RCW; Oznacza to, że dwa zarządzane obiekty nie są równe, ale reprezentują ten sam obiekt COM. Jak pokazano na poniższej ilustracji, dowolna liczba zarządzanych klientów może przechowywać odwołanie do obiektów COM, które uwidaczniają INew interfejsy i INewer .

Na poniższej ilustracji przedstawiono proces uzyskiwania dostępu do obiektów COM za pośrednictwem otoki wywoływanej przez środowisko uruchomieniowe:

Process for accessing COM objects through the RCW.

Przy użyciu metadanych pochodzących z biblioteki typów środowisko uruchomieniowe tworzy wywoływany obiekt COM i otokę dla tego obiektu. Każda wersja RCW przechowuje pamięć podręczną wskaźników interfejsu w obiekcie COM, który opakowuje i zwalnia odwołanie do obiektu COM, gdy RCW nie jest już potrzebny. Środowisko uruchomieniowe wykonuje odzyskiwanie pamięci w wersji RCW.

Między innymi działania RCW marshaluje dane między zarządzanym i niezarządzanym kodem w imieniu opakowanego obiektu. W szczególności RCW zapewnia marshaling dla argumentów metody i zwracanych wartości metody za każdym razem, gdy klient i serwer mają różne reprezentacje danych przekazywanych między nimi.

Standardowa otoka wymusza wbudowane reguły marshalingu. Na przykład gdy klient platformy .NET przekazuje string typ jako część argumentu do niezarządzanego obiektu, otoka konwertuje string element na BSTR typ. Jeśli obiekt COM zwróci BSTR obiekt do zarządzanego obiektu wywołującego, obiekt wywołujący otrzyma element string. Zarówno klient, jak i serwer wysyłają i odbierają znane im dane. Inne typy nie wymagają konwersji. Na przykład standardowa otoka będzie zawsze przekazywać 4-bajtową liczbę całkowitą między zarządzanym i niezarządzanym kodem bez konwertowania typu.

Marshalling wybranych interfejsów

Głównym celem wywoływania otoki środowiska uruchomieniowego (RCW) jest ukrycie różnic między zarządzanymi i niezarządzanymi modelami programowania. Aby utworzyć bezproblemowe przejście, RCW używa wybranych interfejsów COM bez uwidaczniania ich do klienta platformy .NET, jak pokazano na poniższej ilustracji.

Na poniższej ilustracji przedstawiono interfejsy COM i otokę wywoływaną przez środowisko uruchomieniowe:

Screenshot of the runtime callable wrapper with interfaces.

Po utworzeniu jako obiekt wczesnej granicy RCW jest określonym typem. Implementuje interfejsy implementujące i uwidaczniające metody, właściwości i zdarzenia z interfejsów obiektu. Na ilustracji RCW uwidacznia interfejs INew, ale korzysta z interfejsów IUnknown i IDispatch . Ponadto rcW uwidacznia wszystkie elementy członkowskie interfejsu INew dla klienta platformy .NET.

RcW korzysta z interfejsów wymienionych w poniższej tabeli, które są uwidocznione przez obiekt, który opakowuje.

Interfejs opis
Idispatch W przypadku późnego powiązania z obiektami COM przez odbicie.
Ierrorinfo Zawiera tekstowy opis błędu, jego źródła, pliku Pomocy, kontekstu Pomocy i identyfikatora GUID interfejsu, który zdefiniował błąd (zawsze GUID_NULL dla klas platformy .NET).
IProvideClassInfo Jeśli obiekt COM jest opakowany implementuje IProvideClassInfo, RCW wyodrębnia informacje o typie z tego interfejsu, aby zapewnić lepszą tożsamość typu.
IUnknown W przypadku tożsamości obiektu wpisz coercion i zarządzanie okresem istnienia:

- Tożsamość obiektu
Środowisko uruchomieniowe rozróżnia obiekty COM, porównując wartość interfejsu IUnknown dla każdego obiektu.
- Przymus typu
RcW rozpoznaje odnajdywanie typu dynamicznego wykonywane przez metodę QueryInterface .
- Zarządzanie okresem istnienia
Korzystając z metody QueryInterface, RCW pobiera i przechowuje odwołanie do niezarządzanego obiektu, dopóki środowisko uruchomieniowe nie wykona odzyskiwania pamięci na otoce, co zwalnia niezarządzany obiekt.

RcW opcjonalnie używa interfejsów wymienionych w poniższej tabeli, które są uwidocznione przez obiekt, który opakowuje.

Interfejs opis
I Połączenie ionPoint i I Połączenie ionPointContainer RCW konwertuje obiekty, które uwidaczniają styl zdarzenia punktu połączenia na zdarzenia oparte na delegatach.
IDispatchEx (tylko.NET Framework) Jeśli klasa implementuje interfejs IDispatchEx, rcW implementuje IExpando. Interfejs IDispatchEx jest rozszerzeniem interfejsu IDispatch, który w przeciwieństwie do interfejsu IDispatch umożliwia wyliczanie, dodawanie, usuwanie i wywoływanie elementów członkowskich z uwzględnieniem wielkości liter.
Ienumvariant Umożliwia obsługę typów COM, które obsługują wyliczenia, które mają być traktowane jako kolekcje.

Zobacz też