Passaggio 4: individuazione dell'assembly mediante basi di codice o ricerca

Dopo aver determinato la versione corretta dell'assembly utilizzando le informazioni nel riferimento dell'assembly chiamante e nei file di configurazione e dopo aver eseguito un controllo nella Global Assembly Cache (solo per gli assembly con nome sicuro), Common Language Runtime tenta di individuare l'assembly effettuando le operazioni seguenti:

  1. Se nel file di configurazione dell'applicazione viene rilevato un elemento <codeBase>, il runtime verifica il percorso specificato. Se viene individuato un assembly che soddisfa la richiesta, tale assembly viene utilizzato e non vengono eseguite ulteriori ricerche. Se non viene individuato alcun assembly, la richiesta di associazione non viene completata.

  2. Il runtime esegue la ricerca dell'assembly a cui è stato fatto riferimento utilizzando le regole specificate più avanti in questa sezione.

Nota

Se sono presenti più versioni di un assembly in una directory e si desidera fare riferimento a una versione specifica, è necessario utilizzare l'elemento <codeBase> invece dell'attributo privatePath dell'elemento <probing>. Se si utilizza l'elemento <probing>, il runtime interrompe il sondaggio appena trova un assembly che corrisponde al nome semplice dell'assembly a cui fa riferimento, anche se la corrispondenza non è corretta. Se è corretta, l'assembly verrà utilizzato; in caso contrario, la ricerca verrà interrotta e l'associazione non avrà luogo.

Individuazione dell'assembly mediante basi di codice

È possibile fornire le informazioni relative alla base di codice utilizzando l'elemento <codeBase> in un file di configurazione. La base di codice viene sempre controllata prima che il runtime esegua la ricerca dell'assembly a cui è stato fatto riferimento. Se un file dei criteri editore, contenente le informazioni per il reindirizzamento a una versione finale, contiene anche un elemento <codeBase>, verrà utilizzato tale elemento.D48A3983-2297-43FF-A14D-1F29D3995822 Se, ad esempio, un elemento <codeBase> viene specificato nel file di configurazione dell'applicazione e anche in un file dei criteri editore che esegue l'override delle informazioni sull'applicazione,D48A3983-2297-43FF-A14D-1F29D3995822 verrà utilizzato l'elemento <codeBase> presente nel file dei criteri editore.

Se nel percorso specificato dall'elemento <codeBase> non viene individuato alcun assembly, la richiesta di associazione non viene completata e non vengono eseguite ulteriori operazioni. Se viene individuato un assembly che soddisfa i criteri dell'assembly chiamante, verrà utilizzato l'assembly individuato. Quando viene caricato il file indicato dall'elemento <codeBase> specificato, il runtime controlla che il nome, la versione, la lingua e la chiave pubblica corrispondano a quelle del riferimento dell'assembly chiamante.

Nota

Gli assembly a cui viene fatto riferimento che sono esterni alla directory principale dell'applicazione devono avere nomi sicuri e devono essere installati nella Global Assembly Cache o devono essere specificati mediante l'elemento <codeBase>.

Individuazione dell'assembly mediante ricerca

Se nel file di configurazione dell'applicazione non è stato specificato alcun elemento <codeBase>, il runtime esegue la ricerca dell'assembly utilizzando quattro criteri:

  • La base applicativa, ovvero la directory principale nella quale viene eseguita l'applicazione.

  • La lingua, ovvero l'attributo relativo alla lingua dell'assembly a cui viene fatto riferimento.

  • Il nome, ovvero il nome dell'assembly a cui viene fatto riferimento.

  • L'attributo privatePath dell'elemento <probing>, ovvero l'elenco definito dall'utente delle sottodirectory del percorso principale. È possibile specificare questo percorso nel file di configurazione dell'applicazione e nel codice gestito utilizzando la proprietà AppendPrivatePath per un dominio applicazione. Se il percorso viene specificato nel codice gestito, il sondaggio viene eseguito prima nel percorso privatePath specificato nel codice gestito, quindi in quello specificato nel file di configurazione dell'applicazione.

Ricerca nella base applicativa e nelle directory della lingua

Il runtime esegue sempre la ricerca a partire dalla base applicativa, che può essere un URL o la directory principale dell'applicazione su un computer. Se l'assembly a cui viene fatto riferimento non viene individuato nella base applicativa e non viene fornita alcuna informazione relativa alla lingua, il runtime ricerca il nome dell'assembly in tutte le sottodirectory. La ricerca viene eseguita nelle seguenti directory:

   [base applicazione] / [nome assembly].dll

   [base applicazione] / [nome assembly] / [nome assembly].dll

Se per l'assembly a cui viene fatto riferimento vengono specificate le informazioni relative alla lingua, la ricerca viene eseguita solo nelle seguenti directory:

   [base applicazione] / [lingua] / [nome assembly].dll

   [base applicazione] / [lingua] / [nome assembly] / [nome assembly].dll

Sondaggio mediante l'attributo privatePath

Oltre alle sottodirectory relative alla lingua e a quelle specificate per l'assembly a cui viene fatto riferimento, il runtime esegue il sondaggio nelle directory specificate dall'attributo privatePath dell'elemento <probing>. È necessario che queste siano sottodirectory della directory principale dell'applicazione. Le directory esaminate variano in base all'inclusione delle informazioni relative alla lingua nella richiesta dell'assembly a cui viene fatto riferimento.

Il runtime interrompe la ricerca non appena trova un assembly che corrisponde al nome semplice dell'assembly a cui fa riferimento. La corrispondenza potrebbe anche non essere corretta. Se è corretta, l'assembly verrà utilizzato; in caso contrario, la ricerca verrà interrotta e l'associazione non avrà luogo.

Se le informazioni sono state incluse, vengono esaminate le seguenti directory:

   [base applicazione] / [binpath] / [lingua] / [nome assembly].dll

   [base applicazione] / [binpath] / [lingua] / [nome assembly] / [nome assembly].dll

Se le informazioni non sono state incluse, vengono esaminate le seguenti directory:

   [base applicazione] / [binpath] / [nome assembly].dll

   [base applicazione] / [binpath] / [nome assembly] / [nome assembly].dll

Esempi di sondaggio

Date le seguenti informazioni:

  • Nome dell'assembly a cui viene fatto riferimento: myAssembly

  • Directory principale dell'applicazione: http://www.code.microsoft.comhttp://www.code.microsoft.com

  • Elemento <probing> specificato nel file di configurazione: bin

  • Lingua: de

Il runtime esegue la ricerca nei seguenti indirizzi URL:

http://www.code.microsoft.com/de/myAssembly.dll

http://www.code.microsoft.com/de/myAssembly/myAssembly.dll

http://www.code.microsoft.com/bin/de/myAssembly.dll

http://www.code.microsoft.com/bin/de/myAssembly/myAssembly.dll

Più assembly con lo stesso nome

Nell'esempio riportato di seguito viene illustrato come configurare più assembly con lo stesso nome.

   <dependentAssembly>
      <assemblyIdentity name="Server" publicKeyToken="c0305c36380ba429" /> 
         <codeBase version="1.0.0.0" href="v1/Server.dll"/>
         <codeBase version="2.0.0.0" href="v2/Server.dll"/>
   </dependentAssembly>

Altri percorsi esaminati

La posizione dell'assembly può essere determinata anche utilizzando il contesto dell'associazione corrente. Questa situazione spesso si verifica quando viene utilizzato il metodo Assembly.LoadFrom e negli scenari di interoperabilità COM. Se un assembly utilizza il metodo LoadFrom per fare riferimento a un altro assembly, il percorso dell'assembly chiamante viene utilizzato come suggerimento per l'individuazione del percorso dell'assembly a cui viene fatto riferimento. Se viene individuato un assembly che soddisfa la richiesta, il runtime lo carica, altrimenti continua la ricerca utilizzando le proprie regole semantiche e quindi richiedendo l'assembly a Windows Installer. Se non viene fornito alcun assembly che soddisfa la richiesta di associazione, viene generata l'eccezione TypeLoadException nel codice gestito, se è stato fatto riferimento a un tipo, oppure l'eccezione FileNotFoundException, se l'assembly caricato non è stato individuato.

Se, ad esempio, Assembly1 fa riferimento ad Assembly2 e Assembly1 è stato scaricato da http://www.code.microsoft.com/utils, questo URL viene utilizzato come suggerimento per l'individuazione di Assembly2.dll. Il runtime esegue la ricerca dell'assembly negli URL http://www.code.microsoft.com/utils/Assembly2.dll e http://www.code.microsoft.com/utils/Assembly2/Assembly2.dll. Se Assembly2 non viene individuato in nessuno dei due URL, il runtime invia una richiesta a Windows Installer.

Vedere anche

Concetti

Come il runtime individua gli assembly
Scenari di distribuzione di applicazioni .NET Framework
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
Riferimenti di assembly parziali