web-dev-qa-db-fra.com

Comment empêcher une application .NET de charger / référencer un assembly depuis le GAC?

Puis-je configurer une application .NET d'une manière (paramètres dans Visual Studio) qui fait référence à un assembly "local" (pas dans GAC ) au lieu d'un assembly au sein du GAC, bien que les deux assemblées aient le même nom et la même version?

35
Flo

Si les deux assemblys portent un nom fort (signé), le CLR se charge toujours à partir du GAC.

Voici les étapes que le runtime utilise pour résoudre les références d'assembly (from How the Runtime Locates Assemblies ):

  1. Détermine la version d'assembly correcte en examinant les fichiers de configuration applicables, y compris le fichier de configuration d'application, le fichier de stratégie de l'éditeur et le fichier de configuration de la machine. Si le fichier de configuration se trouve sur une machine distante, le runtime doit d'abord localiser et télécharger le fichier de configuration de l'application.

  2. Vérifie si le nom de l'assembly a déjà été lié et, le cas échéant, utilise l'assembly précédemment chargé. Si une demande précédente de chargement de l'assembly a échoué, la demande échoue immédiatement sans tenter de charger l'assembly.

  3. Vérifie le cache d'assembly global. Si l'assembly s'y trouve, le runtime utilise cet assembly.

  4. Sondes pour l'assemblage (... certains matériaux omis ...)

Comme indiqué plus loin dans ce même article:

Aucune version ne vérifie les assemblys sans noms forts, pas plus que le runtime ne vérifie dans le cache d'assembly global les assemblys sans noms forts.

Donc, si vous pouvez vous permettre de supprimer la signature de l'Assemblée locale, l'application l'utilisera à la place de celle du GAC.

Pour plus de détails que vous ne le souhaiteriez probablement sur les mécanismes de liaison à l'exécution, voir blog de Suzanne Cook .

Cette entrée de blog de Scott Hanselman fournit également un excellent aperçu du processus de liaison.

24
Jeff Sternal

Vous pouvez utiliser ilmerge et fusionner les assemblys dans une seule bibliothèque pour contourner ce problème.

1
Kelly Elton

Si vous pouvez modifier le numéro de version de la DLL locale, vous pouvez utiliser une redirection de version de DLL en utilisant l'attribut oldVersion. Vous pouvez utiliser un nom fort pour l'assembly local: veuillez consulter cette page: http://msdn.Microsoft.com/en-us/library/7wd6ex19.aspx

Vous devez également considérer qu'il est possible de modifier le numéro de version d'un assembly compilé comme il est décrit ici: Changer la version de l'assembly dans un assembly .NET compilé

1
Paco Zarate