Un assembly è una raccolta di tipi e risorse progettati per interagire fra loro formando unità funzionali.
Un assembly costituisce l’unità fondamentale per la creazione di applicazioni .NET in quanto svolge le seguenti funzioni:
- contiene codice MSIL (Microsoft Intermediate Language)
- definisce i vincoli di sicurezza ricevendo ed accogliendo le richieste di autorizzazione
- contribuisce alla definizione dei tipi la cui identità include in nome dell’assembli di appartenenza
- assicura l’integrità di versione costituendo la più piccola unità aggiornabile all’interno del Common Language Runtime
- costituisce un’unità di distribuzione: all’avvio di un’applicazione gli unici assembly necessari sono appunto quelli richiesti dall’applicazione stessa per il suo funzionamento
Per risolvere i problemi di controllo delle versioni e di conflitto fra DLL si utilizzano assembly che:
- consentono di specificare regole di versione
- forniscono l’infrastruttura per l’attivazione delle regole il controllo delle versioni
- forniscono l’infrastruttura per l’esecuzione contemporanea di differenti versioni di un componente
Struttura di un assembly
Un assembly è costrituito da quattro elementi:
- il manifesto che contiene i metadati dell’assembly
- i metadati dei tipi utilizzati all’interno del codice MSIL
- il codice MSIL vero e proprio
- un insieme di risorse
 |
Struttura di un assembly
L’immagine a fianco mostra la struttura tipica di un assembly su file singolo (Portable Executable).
L’organizzazione su file singolo è certamente quella per la quale optare quando si dispone di codice scritto nel medesimo linguaggio: è possibile esaminare la struttura interna di un assembly utilizzando l’utility ILDasm.exe fornita con il framework .NET.
|
Tali elementi possono essere raggruppati in un’unico file oppure essere distribuiti su più file: in quest’ultimo caso il manifesto dell’assembly conterrà tutti i riferimenti relativi ai file che costituiscono l’assembly stesso.
Lo stesso manifesto può essere memorizzato in un file Portable Executable (exe o dll) insieme al codice MSIL oppure in un Portable Executable autonomo.
 |
Assembly su più file
Generalmente si opta per un assembly distribuito su più file quando si vogliono mettere insieme moduli sviluppati in linguaggi differenti.
|
Il manifesto di un assembly contiene le seguenti informazioni:
- nome dell’assembly
- numero di versione
- lingua
- nome sicuro
- elenco di tutti i file dell’assembly
- informazioni per il riferimento ai tipi
- informazioni sugli assembly a cui si fa riferimento
E’ possibile modificare o aggiungere informazioni al manifesto utilizzando gli attributi dell’assembly nel proprio codice.
Attributi relativi all’identità
Gli attributi relativi all’identità dell’assembly utilizzabili sono:
- AssemblyCultureAttribute: permette di indicare la lingua supportata dall’assembly
- AssemblyFlagsAttribute: permette di impostare gli attributi relativi all’assembly indicando ad esempio e è possibile l’esecuzione affiancata di più versioni
- AssemblyVersionAttribute: permette di specificare la versione dell’assembly nel formato
...
Attributi informativi
Gli attributi informativi permettono di specificare informazioni addizionali relative all’assembly:
- AssemblyCompanyAttribute: permette di indicare il nome della società che ha prodotto l’assembly
- AssemblyCopyrightAttribute: permette di specificare informazioni relative al copyright
- AssemblyFileVersionAttribute: permette di specificare il numero di versione del file (l’impostazione predefinita corrisponde al numro di versione dell’assembly stesso)
- AssemblyInformationalVersionAttribute: permette di specificare ulteriori informazioni relative alla versione
- AssemblyProductAttribute: utilizzabile per specificare ulteriori informazioni relative al prodotto
- AssemblyTrademarkAttribute: permette di specificare informazioni relative al marchio registrato
Attributi relativi al manifesto dell’assembly
I seguenti attributi permettono di fornire informazioni nel manifesto dell’assembly:
- AssemblyConfigurationAttribute: indica la configurazione dell’assembly (ad esempio finale o debug)
- AssemblyDefaultAliasAttribute: permette di specificare l’alias predefinito che verrà utilizzato da altri assembly come riferimento all’assembly corrente.
- AsemblyDescriptionAttribute: contiene la descrizione dell’assembly stesso
- AssemblyTitleAttribute: consente di specificare un nome descrittivo per l’assembly.
Attributi relativi al nome sicuro
Un nome sicuro è costituito dall’identità dell’assembly (nome semplice, numero di versione, informazioni sulla lingua) nonchè da una chiave pubblica ed una firma digitale.
Il nome sicuro viene generato a partire dal file dell’assembly che contiene il manifesto utilizzando una chiave privata.
I nomi sicuri soddisfano i seguenti requisiti:
- garantiscono l’univocità dei nomi (in quanto basati su una coppia di chiavi univoche)
- garantiscono la discendenza delle versioni di un assembly
- garantiscono un conrtollo di integrità
I criteri di versione predefiniti del Common Language Runtime prevedono che l’applicazione venga eseguita soltanto con le versione con le quali è stata creata: è opportuno precisare che il controllo di versione viene effettuato soltanto sugli assembly con nome sicuro.
Gli attributi relativi al nome sicuro di un assembly sono:
- AssemblyDelaySignAttribute: valore booleano che indica il ritardo della firma
- AssemblyKeyFileAttribute: consente di indicare il nome del file contenete la chiave pubblica
- AssemblyKeyNameAttribute: Indica il contenitore di chiave contenente la coppia di chiavi passata come parametro al costruttore dell’attributo.
Global Assembly Cache
Quando è necessario condividere un assembly fra più applicazioni è possibile inserirlo nella Global Assembly Cache (GAC) utilizzando un programma di installazione in grado di gestire la GAC oppure utilizzando lo strumento gacutil.exe fornito insieme al framework .NET.