2010-11-16 13 views
3

C'est ma demande deplyoment: c: \ Program Files \ produit \ API.dll (Enregistré dans Gac)
c: \ Program Files \ produit \ ApiImpl1.dll (non Gac)
c: \ Program Files \ produit \ ApiImpl2.dll (non Gac)
c: \ ConsoleApplication \ TestApi.exeAjouter Référence aux copies non assemblées Assemblée GAC à charge GAC récursive (C# Visual Studio 2008)

Api.dll est Façade pour l'application qui a mis en œuvre "c: \ Program Files \ Product \" Api.Dll est enregistré dans GAC et dispose d'un résolveur d'assemblage aux DLL qui se trouve dans "c: \ Program Files \ Product \" Api. dll référence à la fois ApiImpl1.dll et ApiImpl2.dll.

Le problème est lorsque ConsoleApplication ajoute une référence à Api.dll Visual Studio copie les ApiImpl1.dll et ApiImpl2.dll de manière récurrente à la destination du projet. (Bien que CopyLocal = False) J'ajouter la référence à la navigation par "c: \ Program Files \ produit \ API.dll"

Pour autant que je sache, j'ai plusieurs solutions:
1) Inscrivez-ApiImpl1.dll et ApiImpl2.dll dans GAC (Non acceptable, j'ai le résolveur de l'Assemblée pour cela)
2) Ajouter au Registre ".Net Add Reference", "c: \ Program Files \ Product" (ne le résout pas)
3) Ajoutez ".NET Add Reference" Registre, "c: \ windows \ Assembly \ gac_msil \ Api.dll (Résolvez-le, mais c'est une mauvaise solution)
4) Modifier manuellement l'attribut ConsoleApplication.csproj et Supprimer HintPath de référence Api.dll. (Non acceptable, parce que je vais avoir beaucoup de coutume les utilisateurs qui utiliseront cette API)

+0

Le "CopyLocal = False" - est-ce sur API.dll ou ApiImpl1.dll? –

+0

Les deux CopyLocal = False – Aviram

Répondre

0

Vous devriez toujours avoir des DLL dépendantes du GAC dans le GAC ... si vous en avez besoin, les autres aussi. Le problème est que tandis que Visual Studio sait où trouver ces fichiers dll par les références, l'application à l'exécution ne saura pas où chercher si les fichiers dll ne sont pas dans le répertoire du projet (d'où la copie).


EDIT
Est-il nécessaire de mettre API.dll dans le GAC si vous avez l'Assemblée résolveur? Peut-être que si cette DLL n'était pas dans le GAC, Visual Studio ne copierait pas les autres fichiers. Je suis assez sûr que c'est un fait qu'une DLL racine est dans le GAC, mais les DLL dépendantes ne sont pas.

+0

Je sais que c'est une mauvaise pratique. Cependant, en Runtime, j'ai résolveur qui trouve les DLL qui ne sont pas situés dans GAC. Le problème que Visual Studio ne sait pas que j'ai AssemblyResolver – Aviram

+0

Je sais qu'il existe des moyens de le faire fonctionner ... mais, comme vous le voyez, il provoque des problèmes. De plus, je ne sais pas quel type de contrôle précis vous utilisez avec le résolveur d'assemblage, mais le GAC contrôlera automatiquement le versionnement et l'installation dans le GAC fournit une méthode de déploiement contrôlée. Pour s'appuyer sur le résolveur d'assemblage, vous devez déployer le RA avec votre application (bien que vous ayez peut-être seulement besoin de déployer sur un serveur?) –