2010-02-12 15 views
5

Nous avons différentes versions d'assemblys non nommés avec des noms forts, et pas de redirections de liaison/chemins d'exploration dans app.exe.config. Par exemple, MyDll (1.0.0.0_null_neutral) et MyDll (2.0.0.0_null_neutral). Par rapport à app.exe, ces assemblys sont stockés dans LAC \ MyDll_1.0.0.0_null_neutral et LAC \ MyDll_2.0.0.0_null_neutral. Je comprends que parce que les assemblys MyDll n'ont pas de nom fort, le runtime .NET ne différencie pas les différentes versions de MyDll. Par conséquent, si MyDll 1.0.0.0 était déjà chargé en mémoire et que du code généré par MyDll 2.0.0.0 était exécuté, le moteur d'exécution .NET ne chargerait pas MyDll 2.0.0.0.Comment le .NET Runtime trouve-t-il des assemblys non nommés de manière forte?

Cependant, lorsque j'ai attaché au processus avec VS2008 et vu la fenêtre des modules, j'ai remarqué que MyDll 1.0.0.0 et MyDll 2.0.0.0 ont été chargés depuis le dossier LAC.

Il semble y avoir une lacune dans ma compréhension quelque part. Quelqu'un peut-il le signaler?

EDIT: Merci pour les réponses jusqu'à présent. Oui, j'ai sauté sur ce peu. L'exécutable écoute l'événement AssemblyResolve et le gère en regardant dans le LAC. J'ai été assez sûr d'avoir vu une documentation MSDN avant que les dites versions soient ignorées à moins qu'un assembly soit nommé avec un nom fort. Je vais voir si je peux le déterrer.

+3

Il ne peut pas fonctionner comme vous le décrivez. Le CLR n'a aucun moyen de trouver une DLL dans le sous-répertoire LAC sans modifier le chemin de sondage. –

+0

Quel est votre but d'avoir deux versions différentes d'un assemblage qui ressemble à la même chose d'ici? Ne pouvez-vous pas charger le dernier pour que votre application fonctionne? –

+0

Il existe 2 versions différentes car l'application est composée de différents plugins écrits par différentes équipes, chacune pouvant utiliser une version différente de l'assemblage. Typiquement, nous utilisons simplement la version la plus élevée via un chemin de palpage/redirection de liaison. Mais je voulais juste savoir si le CLR ne tient pas compte des versions pour les assemblages non nommés. –

Répondre

1

http://msdn.microsoft.com/en-us/library/yx7xezcf.aspx

Etape 2 vérifie pour voir si elle a été chargée, et qui est une version spécifique, même avec des éléments qui ne sont pas un nom fort.

L'étape 4 essaie de charger l'ensemble en effectuant une vérification, et ce n'est pas spécifique à la version. Ce que je suis confus à propos de si vous n'avez aucune information dans votre fichier de configuration, comment est-il trouver la DLL en premier lieu? Je pense qu'il y a aussi une lacune dans ma compréhension :-).