2008-08-22 11 views
21

Mon application charge de façon dynamique les assemblys à l'exécution à partir de sous-dossiers spécifiques. Ces assemblys sont compilés avec des dépendances à d'autres assemblys. Le runtime essaie de les charger depuis le répertoire de l'application. Mais je veux les mettre dans le répertoire des modules.Chargement des assemblages et de leurs dépendances

Existe-t-il un moyen de dire à l'exécution que les DLL se trouvent dans un sous-dossier séparé?

Répondre

18

Une approche bien que je l'ai utilisé ces derniers temps est d'ajouter un gestionnaire d'événements pour l'événement AssemblyResolve du AppDomain.

AppDomain currentDomain = AppDomain.CurrentDomain; 
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler); 

Ensuite, dans la méthode de gestionnaire d'événements, vous pouvez charger l'assemblée qui a été tenté de résoudre en utilisant l'un des Assembly.Load, remplacements de Assembly.LoadFrom et retour de la méthode.

EDIT:

En fonction de vos informations supplémentaires, je pense en utilisant la technique ci-dessus, la résolution spécifiquement les références à une assemblée vous est la seule véritable approche qui va travailler sans restructuration de votre application. Ce qu'il vous donne c'est que l'emplacement de chaque assembly que le CLR ne parvient pas à résoudre peut être déterminé et chargé par votre code lors de l'exécution ... J'ai utilisé ceci dans des situations similaires pour les architectures enfichables et pour une intégrité de référence d'assembly outil d'analyse.

+3

Un bon exemple de cette technique est l'application LINQPad. Il est livré en tant qu'exe unique, de sorte que toutes les bibliothèques sont incluses en tant que ressources intégrées. Voir http://www.albahari.com/nutshell/ch16.aspx pour le code et http://www.linqpad.net/HowLINQPadWorks.aspx pour un aperçu. – Pat

4

Vous pouvez utiliser l'élément <probing> dans un fichier manifeste pour indiquer au Runtime d'examiner dans ses différents répertoires les fichiers d'assemblage.

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

.: par exemple

<configuration> 
<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <probing privatePath="bin;bin2\subbin;bin3"/> 
    </assemblyBinding> 
</runtime> 
</configuration> 
1

Vous pouvez utiliser l'élément <codeBase> trouvé dans le fichier de configuration de l'application. Plus d'informations sur "Locating the Assembly through Codebases or Probing".

Eh bien, l'ensemble chargé n'a pas un fichier de configuration d'application.

Bien, si vous connaissez les dossiers spécifiques à l'exécution, vous pouvez utiliser Assembly.LoadFrom.

+0

Le premier lien indique "Le sujet n'existe plus". Spécifier .Net 4.0 l'affiche cependant: [https://msdn.microsoft.com/en-us/library/15hyw9x3%28v=vs.100%29.aspx](https://msdn.microsoft.com/en -us/library/15hyw9x3% 28v = vs.100% 29.aspx) – AnorZaken

Questions connexes