2010-09-20 18 views

Répondre

4

Il est assez imprudent, le CLR ne peut pas trouver la DLL sans aide. Votre client ne se souciera pas beaucoup de l'emplacement de la DLL. En fait, je pense que la plupart des informaticiens préfèrent les binaires dans le même répertoire.

Si vous placez la DLL dans un sous-répertoire c:\app\bin\dll, vous pouvez utiliser un fichier app.exe.config avec l'élément <probing> pour demander au CLR de rechercher dans ce répertoire. Déploiement à c:\app\dll est beaucoup plus difficile, il faut un très peu pratique <codeBase> dans un <dependentAssembly>. Ce qui rend l'application inamovible, préfèrent la solution de Pierre à la place. Sauf qu'il a besoin de travail, vous voulez utiliser Assembly.GetEntryAssembly().Location pour obtenir le chemin d'installation de l'EXE afin que vous puissiez générer un chemin d'accès relatif à cela.

+0

Je n'étais pas au courant de la possibilité de défier un emplacement pour l'application pour rechercher des DLL via . Compte tenu des problèmes potentiels causés par le déplacement des assemblages en dehors du répertoire de l'application, cela semble être une meilleure solution. Merci de votre aide. – Bryan

2

Vous pouvez toujours utiliser le AssemblyResolveEvent pour spécifier l'emplacement de tout ensemble comme ceci:

public static void Main(string[] args) 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 

    //do something 
} 

private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    Assembly.LoadFrom(fileName); // Load assembly from any file 
    return assembly; 
} 

Cette méthode est appelée à chaque fois qu'il ne peut pas trouver l'emplacement votre fichier. Une autre option consiste à spécifier un répertoire dans la section "Chemin de référence" de la page de propriétés de votre programme.

+0

Cela ne fonctionnera pas comme affiché. Peut-être que vous pouvez le rendre utile en montrant à l'OP comment utiliser Assembly.GetEntryAssembly(). Location pour générer le bon chemin. –

+0

Eh bien non cela ne fonctionnera pas comme posté, parce que fileName n'est pas déclaré ... Tout ce que vous avez à faire est de définir fileName comme l'emplacement de la DLL. Vous pouvez utiliser Assembly.GetExecutingAssembly() pour obtenir l'emplacement de l'EXE, que de trouver l'emplacement relatif de la DLL –

+0

Par ailleurs, je suis d'accord avec Hans post à propos de ce n'est pas la meilleure idée ... J'ai fait quelque chose de similaire pour un de mes projets, et il crée un tas de problèmes, y compris les problèmes de sécurité, qui sont une vraie douleur dans le ... –

0

Une solution pourrait être le déploiement de vos DLL dans le GAC, Global Assembly Cache. De cette façon, votre application les chargera à partir du GAC au lieu de les charger depuis le répertoire de l'application.