web-dev-qa-db-fra.com

C # Placer les DLL requises ailleurs que la racine de la sortie

J'utilise EmguCV pour un projet et lorsque notre programme s'exécute, il a besoin de dll comme "cxcore.dll" etc. (ou il lève des exceptions d'exécution). Pour le moment, je mets les fichiers à la racine du dossier de sortie (sélectionné "Copier toujours" dans les propriétés du fichier dans Visual Studio).

Cependant, cela semble un peu désordonné, d'avoir environ 10 DLL différentes juste là. Y a-t-il en quelque sorte où je peux le déplacer vers un sous-dossier dans le dossier de sortie et il le trouvera toujours.

29
Aishwar

Des réponses étonnantes jusqu'à présent. Rien de bien;) Eh bien,

oui, vous pouvez placer les assemblages dans des emplacements distincts.

Dans la configuration d'application correspondante (app.config qui est copié dans your.exe.config) ajouter:

<runtime>
  <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
    <probing privatePath="lib" />
  </assemblyBinding>
</runtime>

Selon:

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

Cela fera en sorte que le programme regarde dans le chemin privé (dossiers sous son propre dossier) pour les assemblys - un peu comme une application Web recherche/bin.

Vous pouvez également les placer dans le GAC, mais cela devrait être évité à moins qu'il n'y ait d'autres raisons à cela.

Cela étant dit, vous n'en avez vraiment pas besoin. Les utilisateurs ne seront pas confus si vous installez correctement l'application dans le menu Démarrer;) Je n'ai jamais eu ce problème, y compris les projets avec plus de 50 assemblys. Les utilisateurs ne les voient jamais.

63
TomTom

Pour obtenir les assemblys dans un sous-répertoire, vous pouvez les copier manuellement, utilisez un événement avant ou après la construction ou quelque chose de complètement différent.

Pour les charger, vous pouvez utiliser AppDomain.AssemblyResolve Event , ou (comme indiqué par TomTom ) le <probing> Élément . Depuis MSDN:

L'exemple suivant montre comment spécifier les sous-répertoires de base d'application que le runtime doit rechercher pour les assemblys.

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

Le GAC est bien sûr un autre endroit pour vider vos assemblys, mais cela ne compterait pas vraiment comme un sous-répertoire ... à moins que vous n'installiez votre application quelque part, elle ne devrait vraiment pas être installée: P

20
Svish