Istruzioni per l'esposizione delle funzionalità in COM

In Common Language Runtime viene fornito un ampio supporto per l'interazione con i componenti COM. Un componente COM può essere utilizzato dall'interno di un tipo gestito e un'istanza gestita può essere utilizzata da un componente COM. Il supporto è la chiave per passare gradualmente dal codice non gestito al codice gestito, ma crea alcuni problemi nella progettazione delle librerie di classi. Per esporre completamente un tipo gestito nei client COM, il tipo deve esporre la funzionalità in un modo supportato da COM e nel rispetto del contratto di versioni COM.

Contrassegnare le librerie di classi gestite con l'attributo ComVisibleAttribute per indicare se i client COM possono utilizzare la libreria direttamente o se devono utilizzare un wrapper che gestisca la funzionalità per consentirne l'utilizzo.

I tipi e le interfacce che devono essere utilizzati direttamente dai client COM, ad esempio per essere inseriti in un contenitore non gestito, devono essere contrassegnati con l'attributo ComVisible(true). La chiusura transitiva di tutti i tipi a cui viene fatto riferimento dai tipi esposti deve essere contrassegnata in modo esplicito come ComVisible(true); in caso contrario, i tipi verranno esposti come IUnknown.

Nota   I membri di un tipo possono essere contrassegnati anche come ComVisible(false); in questo modo viene ridotta l'esposizione a COM e vengono limitate le restrizioni su ciò che può essere utilizzato da un tipo gestito.

I tipi contrassegnati con l'attributo ComVisible(true) non possono esporre la funzionalità in modo esclusivo in un modo che non è utilizzabile da COM. In particolare COM non supporta i metodi static o i costruttori con parametri. Eseguire il test della funzionalità del tipo dai client COM per garantire un corretto funzionamento. Valutare l'impatto del Registro di sistema per fare in modo che tutti i tipi possano essere creati con CoCreateInstance.

Marshalling per riferimento

Gli oggetti con marshalling per riferimento (MBR, Marshal-by-Reference) sono oggetti utilizzabili in modalità remota. L'uso in remoto degli oggetti viene applicato ai tre tipi indicati di seguito.

  • Tipi le cui istanze vengono copiate quando viene effettuato il marshalling su un limite AppDomain, sullo stesso computer o su un computer diverso. Tali tipi devono essere contrassegnati con l'attributo Serializable.
  • Tipi per i quali nell'ambiente di esecuzione viene creato un proxy trasparente quando viene effettuato il marshalling su un limite AppDomain, ossia sullo stesso computer o un computer diverso. Tali tipi devono derivare direttamente o indirettamente dalla classe System.MarshalByRefObject.
  • Tipi di cui non viene eseguito il marshalling su AppDomains. Rappresenta l'impostazione predefinita.

Quando si effettua il marshalling per riferimento, seguire le istruzioni riportate di seguito.

  • Per impostazione predefinita le istanze devono essere oggetti con marshalling per valore. I relativi tipi devono quindi essere contrassegnati come Serializable.
  • I tipi componenti devono essere oggetti con marshalling per riferimento. Questa condizione dovrebbe riguardare la maggior parte dei componenti in quanto la classe base standard, ovvero la classe System.Component, è una classe con marshalling per riferimento.
  • Se il tipo incapsula una risorsa del sistema operativo, è necessario che sia un oggetto con marshalling per riferimento. Se il tipo implementa l'interfaccia IDisposable è molto probabile che debba essere eseguito il marshalling per riferimento. System.IO.Stream deriva da MarshalByRefObject. La maggior parte dei flussi, ad esempio FileStreams e NetworkStreams, incapsula le risorse esterne e deve essere quindi un oggetto con marshalling per riferimento.
  • Le istanze che mantengono semplicemente lo stato devono essere oggetti con marshalling per valore, ad esempio un DataSet.
  • I tipi speciali che non possono essere chiamati su un AppDomain, ad esempio un contenitore di metodi di utilità static, devono essere contrassegnati come Serializable.

Vedere anche

Istruzioni di progettazione per gli sviluppatori di librerie di classi | Classe System.MarshalByRefObject | Esposizione di componenti .NET Framework in COM