Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le Common Language Runtime expose des objets COM par le biais d’un proxy appelé wrapper pouvant être appelé wrapper pouvant être appelé runtime (RCW). Bien que rcW semble être un objet ordinaire pour les clients .NET, sa fonction principale consiste à marshaler les appels entre un client .NET et un objet COM.
Le runtime crée exactement un RCW pour chaque objet COM, quel que soit le nombre de références qui existent sur cet objet. Le runtime gère un rcW unique par processus pour chaque objet. Si vous créez un RCW dans un domaine d’application ou un appartement, puis transmettez une référence à un autre domaine ou appartement d’application, un proxy vers le premier objet sera utilisé. Notez que ce proxy est un nouvel objet managé et non identique au RCW initial ; cela signifie que les deux objets managés ne sont pas égaux, mais représentent le même objet COM. Comme l’illustre l’illustration suivante, un nombre quelconque de clients gérés peut contenir une référence aux objets COM qui exposent INew
et INewer
interfaces.
L’image suivante montre le processus d’accès aux objets COM via le wrapper pouvant être appelé au runtime :
À l’aide de métadonnées dérivées d’une bibliothèque de types, le runtime crée à la fois l’objet COM appelé et un wrapper pour cet objet. Chaque RCW gère un cache de pointeurs d’interface sur l’objet COM qu’il encapsule et libère sa référence sur l’objet COM lorsque le RCW n’est plus nécessaire. Le runtime effectue le garbage collection sur rcW.
Entre autres activités, rcW marshale les données entre le code managé et non managé pour le compte de l’objet encapsulé. Plus précisément, le RCW fournit un marshaling pour les arguments de méthode et les valeurs de retour de méthode chaque fois que le client et le serveur ont des représentations différentes des données passées entre elles.
Le wrapper standard applique des règles de marshaling intégrées. Par exemple, lorsqu’un client .NET transmet un string
type dans le cadre d’un argument à un objet non managé, le wrapper convertit le string
en type BSTR
. Si l’objet COM retourne un BSTR
à son appelant managé, l’appelant reçoit un string
. Le client et le serveur envoient et reçoivent des données qui leur sont familières. Les autres types ne nécessitent aucune conversion. Par exemple, un wrapper standard passe toujours un entier de 4 octets entre le code managé et non managé sans convertir le type.
Marshaling des interfaces sélectionnées
L’objectif principal du wrapper pouvant être appelé au runtime est de masquer les différences entre les modèles de programmation managés et non managés. Pour créer une transition transparente, RCW consomme les interfaces COM sélectionnées sans les exposer au client .NET, comme illustré dans l’illustration suivante.
L’image suivante montre les interfaces COM et le wrapper pouvant être appelé au runtime :
Lorsqu’il est créé en tant qu’objet à liaison anticipée, le RCW est un type spécifique. Il implémente les interfaces que l’objet COM implémente et expose les méthodes, les propriétés et les événements des interfaces de l’objet. Dans l’illustration, rcW expose l’interface INew, mais utilise les interfaces IUnknown et IDispatch . En outre, rcW expose tous les membres de l’interface INew au client .NET.
RcW consomme les interfaces répertoriées dans le tableau suivant, qui sont exposées par l’objet qu’il encapsule.
Interface | Descriptif |
---|---|
IDispatch | Pour la liaison tardive aux objets COM via la réflexion. |
IErrorInfo | Fournit une description textuelle de l’erreur, de sa source, d’un fichier d’aide, du contexte d’aide et du GUID de l’interface qui a défini l’erreur (toujours GUID_NULL pour les classes .NET). |
IProvideClassInfo | Si l’objet COM encapsulé implémente IProvideClassInfo, rcW extrait les informations de type de cette interface pour fournir une meilleure identité de type. |
IUnknown | Pour l’identité d’objet, la contrainte de type et la gestion de la durée de vie : - Identité de l’objet Le runtime fait la distinction entre les objets COM en comparant la valeur de l’interface IUnknown pour chaque objet. - Type de contrainte RcW reconnaît la découverte de type dynamique effectuée par la méthode QueryInterface . - Gestion de la durée de vie À l’aide de la méthode QueryInterface , rcW obtient et contient une référence à un objet non managé jusqu’à ce que le runtime effectue un garbage collection sur le wrapper, qui libère l’objet non managé. |
RcW consomme éventuellement les interfaces répertoriées dans le tableau suivant, qui sont exposées par l’objet qu’il encapsule.
Interface | Descriptif |
---|---|
IConnectionPoint et IConnectionPointContainer | RcW convertit les objets qui exposent le style d’événement de point de connexion en événements délégués. |
IDispatchEx (.NET Framework uniquement) | Si la classe implémente IDispatchEx, rcW implémente IExpando. L’interface IDispatchEx est une extension de l’interface IDispatch qui, contrairement à l’interface IDispatch, permet l’énumération, l’ajout, la suppression et l’appel de la casse des membres. |
IEnumVARIANT | Permet aux types COM qui prennent en charge les énumérations d’être traitées comme des collections. |