Considerazioni generali
È necessario che tutte le chiamate effettuate tra il codice gestito e non gestito negozino i requisiti imposti da ciascun modello di programmazione. Il modello di programmazione gestito e quello non gestito differiscono sotto molti aspetti. Nella tabella riportata di seguito sono illustrate le caratteristiche distintive di ciascun modello.
Caratteristica | Modello non gestito | Modello gestito |
---|---|---|
Modello di codifica |
Basato su interfaccia |
Basato su oggetto |
Identità |
GUID |
Nomi sicuri |
Meccanismo di gestione degli errori |
HRESULT |
Eccezioni |
Compatibilità dei tipi |
Standard binario |
Standard dei tipi |
Definizione dei tipi |
Libreria dei tipi |
Metadati |
Indipendenza dai tipi |
Non indipendente dai tipi |
Eventualmente sicuro |
Controllo delle versioni |
Immutabile |
Adattabile |
Ad alcune caratteristiche dei modelli di programmazione sono associate entità che è possibile visualizzare, come le librerie dei tipi e i metadati. Alcune possono essere passate come argomenti, ad esempio i GUID (Globally Unique Identifier) e i nomi sicuri. Altre ancora sono più concettuali e il loro impatto sulla progettazione dell'applicazione deve essere indubbiamente preso in considerazione, ma non esiste un mapping diretto tra il modello gestito e quello non gestito per tali caratteristiche.
Nelle sezioni seguenti ogni caratteristica viene descritta nei dettagli.
Modelli di codifica
La comunicazione con gli oggetti non gestiti avviene sempre tramite interfacce, mentre classi e oggetti gestiti possono passare direttamente i dati senza implementare le interfacce.Per impostazione predefinita, un'interfaccia di classe viene generata dall'interoperabilità COM per esporre la funzionalità gestita mediante un'interfaccia a COM quando non ne viene implementata una dall'oggetto o dalla classe.
- Meccanismi di gestione degli errori
Un HRESULT viene di solito restituito dai metodi COM per indicare se la chiamata è o meno riuscita. Il codice gestito incorpora le eccezioni. Per impostazione predefinita, con l'interoperabilità COM viene eseguito il mapping delle eccezioni gestite sugli HRESULT di errore.
- Identità
I GUID identificano un tipo non gestito specifico e non forniscono informazioni sul percorso a tale tipo. I nomi sicuri sono costituiti da un nome di assembly univoco oltre a un nome di tipo. Poiché il tipo viene specificato dal nome di assembly in modo univoco, è possibile riutilizzare un nome di tipo in più assembly. Tramite l'assembly vengono anche introdotte in un tipo gestito una chiave editore, una versione e informazioni sul percorso. I servizi di interoperabilità generano GUID e sono denominati in modo sicuro come richiesto.
- Compatibilità dei tipi
I tipi variano tra codice gestito e non gestito, nonché tra i linguaggi.
- Definizioni dei tipi
Come è noto a chi ha familiarità con le librerie dei tipi, queste contengono solo tipi pubblici. Una libreria dei tipi è inoltre facoltativa. Nel modello gestito di programmazione le informazioni sui tipi sono obbligatorie per tutti i tipi. I servizi di interoperabilità forniscono strumenti per la conversione delle librerie dei tipi in metadati in assembly e di metadati in librerie dei tipi.
- Indipendenza dai tipi
I compilatori non gestiti non prevedono il controllo dei tipi sui tipi di puntatore, esponendo il codice ad attività potenzialmente dannose. In generale, per il codice gestito viene richiesto un livello di attendibilità superiore. È possibile continuare a utilizzare i puntatori nel codice gestito, sebbene il codice presenti limitazioni dovute al comportamento non sicuro. I servizi di interoperabilità consentono di impedire l'accesso al codice non gestito da parte di codice gestito non attendibile.
- Controllo delle versioni
Le interfacce COM sono immutabili. Se si modifica un'interfaccia, è necessario rinominarla con un nuovo GUID. I tipi gestiti possono evolversi, pur mantenendo lo stesso nome.