2009-03-10 8 views
10

J'ai une application C# qui utilise une DLL. Lorsque j'essaie d'exécuter l'application, elle ne peut pas trouver la DLL, sauf si elle se trouve dans le même répertoire ou dans GAC. Je ne veux pas l'avoir dans le même répertoire et je ne veux pas l'installer dans GAC. Est-il possible de dire à l'application où chercher la bibliothèque? (Par exemple, si je veux distribuer l'application aux clients et ils veulent utiliser leurs propres applications qui utiliserait la dll.)Comment définir le chemin de la bibliothèque C# pour une application?

Ajouté:

Je voudrais avoir cette structure de fichier:

MainFolder: bibliothèques, Applications

bibliothèques: lib.dll

Applications: app1.exe

Je ne Je veux le copier dans GAC ou avoir lib.dll dans le dossier Applications. C'est possible?

+0

Tamara, il est également possible d'éditer votre question précédente. Ce serait le moyen préféré. –

+0

Tamara, cette question est très semblable à celle-ci http://stackoverflow.com/questions/629459/c-cannot-find-library-during-runtime –

Répondre

6
+0

Est-ce que c'est fondamentalement la même chose que de copier au GAC? –

+0

Non, ils sont conceptuellement différents. Vous pouvez même rediriger un assembly installé dans GAC vers une autre version par cette méthode. Vous devez modifier la configuration de la machine ou placer la DLL dans un sous-répertoire. Je doute que l'un d'entre eux soit ce que vous voulez, mais comme GvS et Jon l'ont souligné, ce n'est pas une bonne chose en général –

0

Comme je l'ai dit dans ma réponse à votre question précédente:

Utilisez Assembly Redirection instructions dans votre app.config ou machine.config.

8

Je recommanderais que les applications de vos clients copient la DLL qu'ils utilisent dans leur propre répertoire.

VB6 utilisé pour partager dll entre les applications, nous avons un terme pour cela: DLL Hell

+0

+1 Bonne réponse! Je dois upvote! –

+0

S'il vous plaît utiliser le terme plus moderne pour "DLL Hell" ---> Le Global Assembly Cache. =) Je pense que MS signifiait bien ("La route de l'enfer est ...") quand ils ont fait le GAC, mais il se sent comme la même vieille douleur ... application étrange, fonctions manquantes, étapes de déploiement supplémentaires, etc – StingyJack

1

La DLL devra être soit dans le GAC ou dans le répertoire ou un sous-répertoire de l'application, les réponses à votre question précédente m'a dit.

Si vos clients souhaitent écrire leurs propres applications à l'aide de la DLL, installez-les dans le GAC ou demandez-leur également de copier la DLL. Avoir plusieurs copies de la bibliothèque ne semble pas être une bonne chose, mais c'est vraiment: cela signifie que vous pouvez mettre à jour une copie vers une version différente sans casser tout le reste.

0

Vous pouvez vous connecter, puis afficher les actions effectuées par l'infrastructure pour charger un assembly. Cela rend le diagnostic des erreurs de chargement d'assemblage très facile.

L'outil pour faire les deux est "FUSLOGVW.exe" (Fusion Log Viewer, Fusion étant le nom du chargeur) et inclus dans le SDK.

4

Dans votre principal:

AppDomain.CurrentDomain.AssemblyResolve += (s,e)=>{ 
    var filename = new AssemblyName(e.Name).Name; 
    var path = string.format(@"C:\path\to\assembly\{0}.dll", filename); 
    return Assembly.LoadFrom(path); 
}; 

Ajouter une exception à cette manipulation

+0

Merci ; Dans mon cas, nos utilisateurs installent tous un SDK produit spécifique et nous savons à peu près où se trouve la bibliothèque. Le gestionnaire d'événements AssemblyResolve était exactement ce dont j'avais besoin. – Epu

1

Il est possible sans le GAC, mais les assemblées doit être solide nommé et vous devez apporter des modifications à chaque fois que la version App.Config ou Changements de publickeytoken. C'est ce que j'ai Main Program in \, Shared libs in \ Shared. et un sous-programme que je veux séparé dans \ SDK, il utilise .. \ Shared pour les assemblages.

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="shared" /> 
     <dependentAssembly> 
     <assemblyIdentity name="protobuf-net" publicKeyToken="257b51d87d2e4d67" /> 
     <codeBase version="1.0.0.282" href="../protobuf-net.dll"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="SevenUpdate.Base" publicKeyToken="5d1aea1de74f122c" /> 
     <codeBase version="11.5.4.0" href="../SevenUpdate.Base.dll"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="SharpBits.Base" publicKeyToken="5d1aea1de74f122c" /> 
     <codeBase version="11.5.5.0" href="../SharpBits.Base.dll"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Windows" publicKeyToken="5d1aea1de74f122c" /> 
     <codeBase version="11.5.5.0" href="../System.Windows.dll"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="WPFLocalizeExtension" publicKeyToken="5d1aea1de74f122c" /> 
     <codeBase version="11.5.5.0" href="../WPFLocalizeExtension.dll"/> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
Questions connexes