Come impedire a un'applicazione .NET di caricare / fare riferimento a un assembly dal GAC?

StackOverflow https://stackoverflow.com/questions/1606867

  •  05-07-2019
  •  | 
  •  

Domanda

Posso configurare un'applicazione .NET in un modo (impostazioni in Visual Studio) a cui fa riferimento un " local " assembly (non in GAC ) invece di un assembly all'interno del GAC, sebbene entrambi gli assembly abbiano lo stesso nome e la stessa versione?

È stato utile?

Soluzione

Se entrambi gli assembly hanno un nome sicuro (firmato), il CLR verrà sempre caricato dal GAC.

Ecco i passaggi che il runtime utilizza per risolvere i riferimenti di assembly (da Come il runtime Individua le assemblee ):

  
      
  1. Determina la versione dell'assembly corretta esaminando applicabile   file di configurazione, incluso il file   file di configurazione dell'applicazione,   file delle norme del publisher e macchina   file di configurazione. Se la   il file di configurazione si trova in a   macchina remota, il runtime deve   individuare e scaricare l'applicazione   prima il file di configurazione.

  2.   
  3. Verifica se il nome dell'assembly è stato associato prima e, in tal caso,   utilizza l'assembly precedentemente caricato.   Se una richiesta precedente per caricare il file   assemblaggio fallito, la richiesta fallisce   immediatamente senza tentare di caricare   l'assemblea.

  4.   
  5. Controlla la Global Assembly Cache. Se il gruppo si trova lì, il   runtime utilizza questo assembly.

  6.   
  7. Sonde per l'assemblaggio (... parte del materiale omesso ...)

  8.   

Come affermato più avanti in quello stesso articolo:

  

Non esiste una versione che controlla gli assembly senza nomi sicuri, né il runtime   controlla nella cache globale degli assembly gli assembly senza nomi sicuri.

Quindi, se puoi permetterti di rimuovere la firma dall'assembly locale, l'applicazione lo utilizzerà invece di quello nel GAC.

Per ulteriori dettagli di quanto si possa desiderare sui meccanismi di runtime, consultare il blog di Suzanne Cook .

Questa voce di blog di Scott Hanselman offre anche un'ottima panoramica del processo di rilegatura.

Altri suggerimenti

Se è possibile modificare il numero di versione della dll locale, è possibile utilizzare un reindirizzamento della versione della dll utilizzando l'attributo oldVersion. È possibile utilizzare un nome sicuro per l'assembly locale: Si prega di guardare questa pagina: http://msdn.microsoft.com/en-us/library/7wd6ex19. aspx

Inoltre, è necessario considerare che è possibile modificare il numero di versione di un assembly compilato come descritto qui: Modifica la versione dell'assembly in un assembly .NET compilato

Puoi usare ilmerge e unire gli assiemi in un'unica libreria per aggirarlo.

Per distribuire correttamente l'applicazione .NET Framework, è necessario comprendere come il Common Language Runtime individua e si lega agli assembly che compongono l'applicazione. Per impostazione predefinita, il runtime tenta di collegarsi con la versione esatta di un assembly con cui è stata creata l'applicazione. Questo comportamento predefinito può essere ignorato dalle impostazioni del file di configurazione.

È possibile visualizzare le informazioni di rilegatura nel file di registro utilizzando il Visualizzatore registri di associazione (Fuslogvw.exe), incluso in Windows Software Development Kit (SDK).

s

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top