Come il runtime individua gli assembly
Per distribuire correttamente un'applicazione .NET Framework, è necessario comprendere il modo in cui Common Language Runtime individua e associa gli assembly che costituiscono l'applicazione. Per impostazione predefinita, il runtime tenta di creare un'associazione con la versione esatta dell'assembly con cui è stata compilata l'applicazione. Il comportamento predefinito può essere modificato dalle impostazioni del file di configurazione.
Quando Common Language Runtime tenta di individuare un assembly e di risolvere un riferimento a un assembly, vengono eseguite diverse operazioni, ciascuna delle quali è descritta nelle sezioni riportate di seguito. Spesso viene utilizzato il termine "ricerca" per descrivere la modalità in cui il runtime individua gli assembly. Questo termine si riferisce a un insieme di regole euristiche che vengono utilizzate per individuare gli assembly in base al nome e alle impostazioni cultura.
Nota |
---|
È possibile visualizzare le informazioni di associazione nel file di log utilizzando il visualizzatore registro associazione assembly (Fuslogvw.exe) fornito con Windows Software Development Kit (SDK). |
Avvio dell'associazione
Il processo di individuazione e associazione di un assembly inizia quando il runtime tenta di risolvere un riferimento a un altro assembly, che può essere un riferimento statico o dinamico. Il compilatore registra i riferimenti statici nei metadati del manifesto dell'assembly durante la generazione. I riferimenti dinamici vengono costruiti automaticamente nel momento in cui vengono chiamati i diversi metodi, ad esempio System.Reflection.Assembly.Load.
Il sistema migliore per fare riferimento a un assembly consiste nel definire un riferimento completo, che includa il nome, la versione, le impostazioni cultura e il token di chiave pubblica, se esistente, dell'assembly. Il runtime utilizza quindi queste informazioni per individuare l'assembly, eseguendo le operazioni descritte più avanti in questa sezione. Indipendentemente dal tipo di assembly, statico o dinamico, a cui viene fatto riferimento, viene utilizzato lo stesso processo di risoluzione.
È possibile anche fare riferimento a un assembly in modo dinamico specificando nel metodo chiamante solamente una parte delle informazioni sull'assembly, ad esempio il nome. In questo caso, la ricerca dell'assembly viene eseguita solo nella directory dell'applicazione e non vengono eseguiti altri controlli. È possibile creare un riferimento parziale utilizzando uno dei diversi metodi per il caricamento degli assembly, quale System.Reflection.Assembly.Load o System.AppDomain.Load.
È infine possibile creare un riferimento dinamico utilizzando un metodo, quale System.Reflection.Assembly.Load, fornire informazioni parziali e qualificare poi il riferimento utilizzando l'elemento<qualifyAssembly> nel file di configurazione dell'applicazione. Questo elemento consente di specificare tutte le informazioni sul riferimento, ovvero il nome, la versione, le impostazioni cultura e, se utilizzabile, il token di chiave pubblica, nel file di configurazione dell'applicazione anziché nel codice. Questa tecnica può essere utilizzata quando si desidera creare un riferimento completo a un assembly che si trova all'esterno della directory dell'applicazione o quando si desidera fare riferimento a un assembly che si trova nella Global Assembly Cache ma si preferisce definirlo in modo completo nel file di configurazione anziché nel codice.
Nota |
---|
Il tipo di riferimento parziale descritto sopra non può essere utilizzato con gli assembly condivisi tra diverse applicazioni.Poiché le impostazioni di configurazione vengono definite a livello di applicazione e non a livello di assembly, se è presente un assembly condiviso in cui si utilizza questo tipo di riferimento parziale, per ciascuna applicazione in cui si utilizza l'assembly condiviso deve essere presente un file di configurazione con le informazioni complete sull'assembly. |
Per risolvere il riferimento a un assembly, il runtime effettua le operazioni seguenti:
Determina la versione corretta dell'assembly esaminando i file di configurazione applicabili, tra cui il file di configurazione dell'applicazione, il file dei criteri editore e il file di configurazione del computer. Se il file di configurazione si trova su un computer remoto, il runtime deve individuare e scaricare prima il file di configurazione dell'applicazione.
Controlla se in precedenza è già stato utilizzato un riferimento al nome dell'assembly e, in tal caso, utilizza l'assembly caricato in precedenza. Se una richiesta precedente di caricamento dell'assembly ha avuto esito negativo, la richiesta viene arrestata immediatamente senza tentare di caricare l'assembly.
Nota La memorizzazione nella cache degli errori di associazione degli assembly è una nuova funzionalità di .NET Framework versione 2.0.
Verifica la presenza dell'assembly nella Global Assembly Cache e utilizza l'assembly eventualmente individuato nella cache.
Ricerca l'assembly effettuando le operazioni seguenti:
Se i criteri dell'editore e le impostazioni di configurazione non influenzano il riferimento originale e se la richiesta di associazione è stata creata utilizzando il metodo Assembly.LoadFrom, il runtime cerca suggerimenti per individuare il percorso.
Se nei file di configurazione viene individuata una base di codice, il runtime esegue la ricerca solo in tale percorso. Se la ricerca non ha esito positivo, il runtime stabilisce che la richiesta di associazione non è riuscita e non esegue altre ricerche.
Esegue la ricerca dell'assembly utilizzando le regole euristiche descritte nella sezione relativa alla ricerca. Se l'assembly non viene individuato, il runtime invia una richiesta di assembly a Windows Installer. Viene utilizzata in questo modo una funzionalità di installazione su richiesta.
Nota Per gli assembly senza nome sicuro, non esiste un controllo della versione e il runtime non ne verifica la presenza nella Global Assembly Cache.
Vedere anche
Concetti
Passaggio 1: esame dei file di configurazione
Passaggio 2: controllo di assembly a cui è stato fatto riferimento in precedenza
Passaggio 3: controllo della Global Assembly Cache
Passaggio 4: individuazione dell'assembly mediante basi di codice o ricerca