2011-11-09 4 views
2

J'utilise Visual Studio 2010 et C# pour créer des applications WinForms et des bibliothèques de classes. J'ai quelques bibliothèques communes que j'utilise pour tous les produits, et puis quelques bibliothèques spécifiques au produit pour mes applications. Aucune de mes assemblées n'est GAC'd. Tous les projets copient leur sortie à partir de leur dossier bin \ Debug respectif vers un dossier Repository commun et toutes les références d'assembly pointent vers ce dossier Repository.Visual Studio 2010 Assembly Référence Problème

Par exemple, Common.DAL.dll, Common.BLL.dll, Product.DAL.dll, Product.BLL et Product.exe

Les références entre les assemblées sont généralement quelque chose comme ceci:

  • Product.exe comprend une référence à Product.BLL
  • Product.BLL inclut des références à Common.BLL et Product.DAL
  • Product.DAL comprend une référence à Common.DAL
  • Comm on.BLL comprend refrence à Common.DAL

Lorsque tous ceux-ci sont inclus dans la même solution, la construction depencies sont quelque chose comme ceci:

  • Common.BLL dépend Common.DAL
  • Product.DAL dépend de Common.DAL
  • Product.BLL dépend de Common.BLL et Product.DAL
  • Product.exe dépend Product.BLL

Ce qui fait quelque chose de l'ordre de construction comme celui-ci:

  1. Common.DAL
  2. Common.BLL
  3. Product.DAL
  4. Product.BLL
  5. Product.exe

Souvent, lorsque j'essaie d'exécuter une application, j'obtiens l'erreur suivante:

Impossible de charger le fichier ou l'assemblage 'Common.DAL, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 4e5249f2e70e1da8' ou l'une de ses dépendances. Le système ne peut pas trouver le fichier spécifié.

J'ai fait remonter le problème au fait que tous les assemblys construits à partir de la solution ne se retrouvent pas dans le dossier bin \ Debug de Product.exe.

Si je nettoie la solution, puis reconstruire, les fichiers apparaissent quelque chose comme ceci:

  • Common.DAL \ bin \ Debug contient Common.DAL.dll
  • Common.BLL \ bin \ Le débogage contient Common.BLL.dll et Common.DAL.dll
  • Product.DAL \ bin \ Debug contient Common.DAL.dll et Product.DAL.dll
  • Product.BLL \ bin \ Debug contient Common.BLL. dll, Common.DAL.dll, Product.BLL.dll et Product.DAL.dll
  • mais Product.exe \ bin \ Debug contient uniquement Product.exe, Product.BLL et Product.DAL. Il manque les assemblages communs. Donc quand je cours Product.exe, j'obtiens l'erreur énumérée ci-dessus.

J'ai vérifié les propriétés de tous mes projets et propriétés. Ils utilisent tous .NET Framework 4. Toutes les références à mes assemblys ont la propriété 'Specific Version' définie sur false et la propriété 'Copy Local' sur true.

Je la force les ensembles manquants à copier Product.exe \ bin \ Debug en ajoutant des références aux assemblées communes dans le projet Product.exe, mais depuis Product.exe ne explicitement utilise la Assemblées communes, cela ressemble plus à un kludge qu'à une solution. J'ai regardé à travers la documentation MSDN et Visual Studio pour voir si je pouvais savoir ce qui influence ou affecte la copie des assemblages référencés, et j'ai cherché SO pour des problèmes similaires, mais je n'ai rien trouvé d'utile.

Je ne sais pas où aller ni quoi faire ensuite.

+3

Pourquoi ne voulez-vous pas utiliser projet les références? Si vous utilisez des références de projet partout, avez-vous toujours ce problème? – McKay

+0

Nous avons rencontré cela dans quelques projets et nous avons fini par avoir des références à tous les assemblys de l'assembly le plus haut (* .exe ou le site web) avec "copylocal = true". C'est une solution de contournement et je me demande aussi quelle serait la véritable cause d'un tel comportement. –

+0

@McKay, les références de projet ne sont bonnes que lorsque les projets existent tous dans la même solution. Plusieurs fois, tous les projets ne seront pas dans la même solution. Les assemblys Common.DAL et Common.BLL ne seront généralement pas dans la solution Product.exe et même les projets Product.DAL et Product.BLL ne doivent pas nécessairement être dans la solution Product.exe. –

Répondre

3

Dans votre question, vous dites:

I can force the missing assemblies to be copied to Product.exe\bin\Debug by adding references to the Common assemblies in the Product.exe project, but since Product.exe doesn't explicitly use the Common assemblies, this feels more like a kludge than a solution.

Je ne pense pas que je suis d'accord. Ce n'est pas parfait, mais Visual Studio a parfois besoin de cette solution même intra. Cela dépend de la façon dont vous utilisez la classe.

Même si vous pensez qu'il est un peu bidouille, il semble que l'autre (oserais-je dire « kludgy ») exigences (un projet par solution) font les choses semblent kludgy

+0

Eh bien, kludgy ou pas, je dois aller avec cette réponse, car elle a le moins d'impact sur notre processus de développement. Nous ne sommes pas en mesure de réorganiser notre processus de construction et tous les projets et solutions que nous développons et maintenons actuellement. Merci pour les commentaires. =) –

2

Vous ne devez mentionner les ensembles nus que lorsqu'ils sont relativement stables et en dehors de de la solution.

À l'intérieur de votre solution, référencez-les dans l'onglet Projets. Ceci va permettre à VS de configurer les dépendances et l'ordre de construction corrects entre les projets.

Dans votre configuration actuelle, vérifiez les dépendances du projet (Solution | Propriétés).

+0

Je ne suis pas d'accord. Si je fais cela, chaque fois que j'ajoute un projet à une solution, je dois soit ajouter tous les projets que _that_ référence au projet, soit changer toutes les références de ce projet vers de nouveaux emplacements. Si je fais toutes mes références aux assemblys dans mon dossier Repository, je n'ai pas besoin de les changer, quelle que soit la solution dans laquelle ils sont inclus. –

+0

J'irais avec Henk ici. Si vous avez de nombreuses solutions avec de nombreux projets barrés, vous avez une architecture spaghetti. Si vous avez beaucoup de projets avec des projets référencés dans de nombreuses solutions: peut-être est-il temps d'envisager de créer des DLL d'interface et de mettre en place l'implémentation complexe ci-dessous. Faire des composants logiques avec des interfaces entre eux. – zmilojko

+0

@zmilojko, je ne suis pas sûr que je suis. Êtes-vous en train de dire que si je fais référence à une assemblée qui, à son tour, fait référence à 5 autres assemblées, je devrais toujours inclure ces 5 autres assemblées dans ma solution? Qu'en est-il de l'un des assemblages que l'un de ces assemblages référence? –

Questions connexes