2008-12-17 12 views
18

J'ai une librairie CommonUtils que j'ai intégrée dans une DLL dont je fais référence à plusieurs de mes projets. CommonUtils dépend de log4net.dll qui a été défini comme référence de fichier et copy-local = true lors de la construction de CommonUtils.dll. Les fichiers log4net.dll et CommonUtils.dll ne sont pas au format GAC.Dépendances de références non copiées dans le répertoire de sortie

Tout fonctionne correctement dans MyWorkingProject où j'ai seulement une référence de fichier à CommonUtils.dll - log4net.dll apparaît dans le répertoire de sortie (car il est une dépendance de CommonUtils.dll, mais pas référencé à partir de MyWorkingProject). Cependant, si je crée un nouveau projet pour ajouter des tests unitaires: MyWorkingProjectTest et la référence de projet MyWorkingProject, puis la référence de fichier CommonUtils.dll ici (je veux utiliser certains des CommonUtils) puis lors de la construction de log4net.dll qui est une dépendance à la fois La référence du projet et la référence du fichier ne sont pas copiées dans le répertoire de sortie.

Quelqu'un peut-il clarifier ce qui se passe ici? Est-ce que le compilateur ne sait pas lequel des fichiers log4net.dll il devrait saisir? Y at-il quelque chose que je fais mal ici? Dois-je faire cela d'une autre manière pour que le fichier log4net.dll soit copié explicitement? Cela a-t-il un sens que je doive explicitement faire référence à log4net?

Répondre

1

Je crois que si vous n'ajoutez pas log4net comme référence dans votre projet, il ne sera pas copié.

+0

Comment ajouteriez-vous log4net comme référence de projet car je n'ai que la DLL binaire distribuée. Aussi pourquoi devrais-je ajouter une référence à lui comme c'est simplement une dépendance d'une de mes références. Quelqu'un a déclaré que vous ne devriez pas référencer les bibliothèques que vous n'utilisez pas explicitement dans votre code. – Fadeproof

+0

Je ne voulais pas parler de «référence de projet» plutôt que de «référence» dans votre projet. – user7116

0

Lorsque j'ai eu une situation similaire dans le passé, j'ai reçu un avertissement de compilateur dans Visual Studio me disant que j'avais besoin d'ajouter une référence à la bibliothèque dépendante.

Recevez-vous un tel avertissement lorsque vous compilez? Si oui, suivez les conseils donnés et vous devriez trouver Log4net copié dans votre répertoire de sortie.

+0

Le problème est que j'ai deux références qui ont des dépendances sur log4net et il semble qu'il y ait quelque chose de construit dans Visual Studio pour ne pas copier la dépendance conflictuelle (disons que c'est la même chose). Tout fonctionne comme prévu si je ne fais référence qu'à 1 mais ce n'est pas copié si je fais référence aux deux. ? – Fadeproof

+0

Les deux références correspondent-elles vraiment au même assemblage? Vérifiez les propriétés de chaque référence pour vous assurer que le chemin est identique. – Bevan

2

Ceci est voulu. Vous devez réfléchir aux implications que l'héritage automatique des références pourrait provoquer. Alors que vous pouvez logiquement voir ce que les références devraient être, il n'y a pas de telle délimitation au compilateur. En théorie, vous pourriez finir par reproduire le Framework et une bonne partie de votre système d'exploitation en parcourant tout l'arbre des dépendances.

C'est certainement une douleur, et je suis d'accord avec vous et je comprends votre frustration, mais je suppose que Microsoft n'a pas été capable de trouver une façon logique de faire autrement.

+0

Pouvez-vous me conseiller sur la façon dont je devrais faire ça? Si j'ai LibA et LibB qui dépendent tous deux de log4net et se trouvent dans MyProjDir/LibA et MyProjDir/LibB qui contiennent tous les deux log4net.dll. Quel log4net.dll devrais-je référencer? Cop-local vrai pour log4net.dll n'est-il pas le chemin à parcourir lors de la construction de libA et libB? – Fadeproof

+0

Personnellement, j'ajoute des références partagées au projet de niveau supérieur. Par exemple, si vos deux bibliothèques seront utilisées par et application, j'ajouterais log4net.dll directement dans le dossier/bin de l'application. Ce n'est pas la meilleure solution, mais je trouve que c'est plus facile que de chercher la référence. –

+0

"par et application" = "par une application". En outre, en disant que j'ajoute les références au niveau supérieur est trompeur.Je n'ajoute pas de référence - je viens de l'ajouter dans le dossier/bin car il sera dans le chemin d'exploration pour les bibliothèques qui le recherchent. –

Questions connexes