Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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:
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:
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. |