Condividi tramite


Wrapper richiamabile a runtime

Common Language Runtime espone oggetti COM tramite un proxy denominato runtime callable wrapper (RCW). Anche se l'RCW sembra essere un oggetto comune per i client .NET, la funzione principale consiste nel effettuare il marshalling delle chiamate tra un client .NET e un oggetto COM.

Il runtime crea esattamente un RCW per ogni oggetto COM, indipendentemente dal numero di riferimenti presenti in tale oggetto. Il runtime gestisce un singolo RCW per processo per ogni oggetto. Se si crea un RCW in un dominio applicativo o in un appartamento e quindi si passa un riferimento a un altro dominio applicativo o appartamento, sarà utilizzato un proxy dell'oggetto originale. Si noti che questo proxy è un nuovo oggetto gestito e non uguale all'RCW iniziale; ciò significa che i due oggetti gestiti non sono uguali ma rappresentano lo stesso oggetto COM. Come illustrato nella figura seguente, un numero qualsiasi di client gestiti può contenere un riferimento agli oggetti COM che espongono le interfacce INew e INewer.

L'immagine seguente illustra il processo di accesso agli oggetti COM tramite il wrapper chiamabile in fase di esecuzione:

Processo per l'accesso agli oggetti COM tramite RCW.

Usando i metadati derivati da una libreria dei tipi, il runtime crea sia l'oggetto COM chiamato che un wrapper per tale oggetto. Ogni RCW mantiene una cache di puntatori di interfaccia sull'oggetto COM di cui esegue il wrapping e rilascia il riferimento sull'oggetto COM quando l'RCW non è più necessario. Il runtime esegue l'operazione di Garbage Collection nell'RCW.

Tra le altre attività, rcw effettua il marshalling dei dati tra codice gestito e non gestito, per conto dell'oggetto di cui è stato eseguito il wrapping. In particolare, l'RCW fornisce il marshalling per gli argomenti del metodo e i valori restituiti dal metodo ogni volta che il client e il server hanno rappresentazioni diverse dei dati passati tra di loro.

Il wrapper standard applica regole di marshalling predefinite. Ad esempio, quando un client .NET passa un tipo string come parte di un argomento a un oggetto non gestito, il wrapper converte il tipo string in un tipo BSTR. Se l'oggetto COM restituisce un oggetto BSTR al chiamante gestito, il chiamante riceve un oggetto string. Sia il client che il server inviano e ricevono dati familiari. Altri tipi non richiedono alcuna conversione. Ad esempio, un wrapper standard trasferirà sempre un intero a 4 byte tra il codice gestito e quello non gestito senza convertire il tipo.

Organizzazione di interfacce selezionate

L'obiettivo principale del wrapper chiamabile in fase di esecuzione è nascondere le differenze tra i modelli di programmazione gestiti e non gestiti. Per creare una transizione senza interruzioni, rcw utilizza interfacce COM selezionate senza esporle al client .NET, come illustrato nella figura seguente.

L'immagine seguente mostra le interfacce COM e il wrapper chiamabile in fase di esecuzione:

Screenshot del wrapper chiamabile in fase di esecuzione con interfacce.

Quando viene creato come oggetto con associazione anticipata, RCW è un tipo specifico. Implementa le interfacce implementate dall'oggetto COM ed espone i metodi, le proprietà e gli eventi dalle interfacce dell'oggetto. Nell'illustrazione, RCW espone l'interfaccia INew ma usa le interfacce IUnknown e IDispatch . Inoltre, rcw espone tutti i membri dell'interfaccia INew al client .NET.

L'RCW utilizza le interfacce elencate nella tabella seguente, esposte dall'oggetto a cui esegue il wrapping.

Interfaccia Descrizione
IDispatch Per l'associazione tardiva a oggetti COM tramite reflection.
IErrorInfo Fornisce una descrizione testuale dell'errore, la relativa origine, un file della Guida, il contesto della Guida e il GUID dell'interfaccia che ha definito l'errore (sempre GUID_NULL per le classi .NET).
IProvideClassInfo Se l'oggetto COM sottoposto a wrapping implementa IProvideClassInfo, RCW estrae le informazioni sul tipo da questa interfaccia per fornire un'identità del tipo migliore.
IUnknown Per l'identità dell'oggetto, la coercizione dei tipi e la gestione del ciclo di vita:

- Identità dell'oggetto
Il runtime distingue tra gli oggetti COM confrontando il valore dell'interfaccia IUnknown per ogni oggetto.
- Coercizione dei tipi
RCW riconosce l'individuazione dinamica dei tipi eseguita dal metodo QueryInterface .
- Gestione della vita utile
Usando il metodo QueryInterface , l'RCW ottiene e contiene un riferimento a un oggetto non gestito fino a quando il runtime non esegue l'operazione di Garbage Collection nel wrapper, che rilascia l'oggetto non gestito.

L'RCW utilizza facoltativamente le interfacce elencate nella tabella seguente, esposte dall'oggetto a cui esegue il wrapping.

Interfaccia Descrizione
IConnectionPoint e IConnectionPointContainer RCW converte gli oggetti che espongono lo stile di evento del punto di connessione in eventi basati su delegati.
IDispatchEx (solo .NET Framework) Se la classe implementa IDispatchEx, rcw implementa IExpando. L'interfaccia IDispatchEx è un'estensione dell'interfaccia IDispatch che, a differenza di IDispatch, abilita l'enumerazione, l'aggiunta, l'eliminazione e la chiamata con distinzione tra maiuscole e minuscole dei membri.
IEnumVARIANT Abilita i tipi COM che supportano le enumerazioni da considerare come raccolte.

Vedere anche