Marshalling predefinito per le classi
Il marshalling delle classi può essere eseguito solo mediante l'interoperabilità COM e per questa operazione le classi sono sempre considerate interfacce. In alcuni casi, l'interfaccia utilizzata per il marshalling della classe è nota come interfaccia della classe. Per informazioni sull'esecuzione dell'override dell'interfaccia della classe con un'altra interfaccia, vedere Introduzione all'interfaccia della classe.
Passaggio di classi a COM
Quando una classe gestita viene passata a COM, il gestore di marshalling di interoperabilità esegue automaticamente il wrapping della classe con un proxy COM e passa l'interfaccia della classe prodotta dal proxy alla chiamata al metodo COM. Tutte le chiamate sull'interfaccia della classe vengono quindi delegate dal proxy all'oggetto gestito. Vengono anche esposte altre interfacce che non sono esplicitamente implementate dalla classe. Il proxy implementa automaticamente le interfacce come IUnknown e IDispatch per conto della classe.
Passaggio di classi al codice .NET
Le coclassi non sono in genere utilizzate come argomenti del metodo in COM. Di solito viene passata un'interfaccia predefinita al posto di una coclasse.
Quando si passa un'interfaccia nel codice gestito, il gestore di marshalling di interoperabilità ne esegue il wrapping con il wrapper appropriato, passando quest'ultimo al metodo gestito. Determinare quale wrapper utilizzare può risultare difficile. Ogni istanza di oggetto COM ha un wrapper singolo e univoco, indipendentemente dal numero di interfacce implementate. Ad esempio, un singolo oggetto COM che implementa cinque interfacce distinte ha un unico wrapper, che espone tutte e cinque le interfacce. La creazione di due istanze dell'oggetto COM implica la creazione di due istanze del wrapper.
Affinché il wrapper mantenga lo stesso tipo per tutta la sua durata, è necessario che il gestore di marshalling di interoperabilità individui il wrapper corretto la prima volta che un'interfaccia esposta dall'oggetto viene passata attraverso il gestore. L'oggetto viene identificato dal gestore di marshalling mediante l'osservazione di una delle interfacce da esso implementate.
Il gestore di marshalling, ad esempio, stabilisce che occorre utilizzare il wrapper della classe per eseguire il wrapping dell'interfaccia passata nel codice gestito. Quando l'interfaccia viene passata attraverso il gestore di marshalling per la prima volta, questo verifica se l'interfaccia proviene da un oggetto noto. La verifica viene eseguita in due casi:
Un'interfaccia viene implementata da un altro oggetto gestito passato a COM in un'altra posizione. Le interfacce esposte da oggetti gestiti vengono immediatamente identificate dal gestore di marshalling che è in grado di far corrispondere l'interfaccia con l'oggetto gestito che fornisce l'implementazione. L'oggetto gestito viene quindi passato al metodo e non sono necessari wrapper.
L'interfaccia viene implementata da un oggetto di cui è già stato eseguito il wrapping. Per stabilire se si tratta di un caso di questo tipo, il gestore di marshalling richiede all'oggetto l'interfaccia IUnknown e confronta l'interfaccia restituita con quelle di altri oggetti di cui è stato eseguito il wrapping. Se l'interfaccia è identica a quella di un altro wrapper, gli oggetti hanno la stessa identità e il wrapper esistente viene passato al metodo.
Se un'interfaccia non arriva da un oggetto noto, le seguenti operazioni vengono eseguite dal gestore di marshalling:
Viene eseguita una query nell'oggetto per cercare l'interfaccia IProvideClassInfo2. Se disponibile, viene utilizzato il CLSID restituito da IProvideClassInfo2.GetGUID per identificare la coclasse che fornisce l'interfaccia. Con il CLSID è possibile individuare il wrapper dal Registro di sistema se l'assembly è stato registrato in precedenza.
Viene eseguita una query nell'interfaccia per IProvideClassInfo. Se disponibile, l'interfaccia ITypeInfo restituita da IProvideClassInfo.GetClassinfo viene utilizzata per determinare il CLSID della classe che espone l'interfaccia. È possibile utilizzare il CLSID per individuare i metadati per il wrapper.
Se non è ancora in grado di identificare la classe, il gestore di marshalling esegue il wrapping dell'interfaccia con una classe wrapper generica denominata System.__ComObject.
Vedere anche
Concetti
tipi copiabili e non copiabili