2008-11-26 10 views
44

Je me demande ce que copy-local = true pour les références fait exactement. Copie-t-il l'assembly référencé avec toutes ses dépendances dans le répertoire de sortie? Mon scénario est le suivant: J'ai un wrapper de journal personnalisé qui utilise log4net. Je compile un ensemble de versions de MyLogWrapper.dll avec la référence log4net.dll définie sur copy-local true. Référencer MyLogWrapper.dll à partir de MyProject avec copie locale définie sur true devrait entraîner la copie de log4net.dll aussi bien? Je référence seulement MyLogWrapper.dll et aucune de ses dépendances dans MyProject. log4net.dll n'est pas copié dans le répertoire de sortie MyProject, mais toutes les autres dépendances de MyLogWrapper le sont. Quel pourrait être le problème?Comment Copy-local fonctionne-t-il? log4net.dll n'est pas copié dans le répertoire de sortie MyProject

J'ai fait plus d'expériences et il semble que si je supprime l'assembly (log4net.dll) de GAC, il commence à être copié localement. Quelqu'un peut-il confirmer que c'est le problème?

Répondre

4

Lorsque la copie locale est définie sur true, elle copiera tous les attributs dont l'attribut local copy = tue dans le répertoire bin de l'application.

Dans votre cas, la DLL pourrait utiliser l'autre dll, donc elle l'exige également.

+8

... sauf ceux dans GAC. – JustAMartin

+0

Même ceux de GAC sont copiés avec VS 2015 si le projet est référencé par un autre projet dans l'autre répertoire de sortie du projet. Vois ma réponse. – vezenkov

5

Vous devez être un peu méfiant de la copie locale car elle m'a attrapé dans le passé!

Parfois, pour un .dll particulier, il ne parviendra pas à le copier dans le dossier de construction. Habituellement, cela n'apparaît pas sur une machine de développement puisque les dll sont aussi souvent dans le GAC (si vous avez installé un outil de développement/bibliothèque que vous utilisez pour le développement) et que vous ne le remarquez pas avant d'être distribué/groupé dans un programme d'installation et les fichiers requis sont manquants sur un ordinateur client.

Il n'y a pas beaucoup d'informations sur ce bogue, mais ce fil le démontre pour une bibliothèque particulière: here. Ayant été pris par cela, je pense que c'est une bonne idée (généralement dans tous les cas) de savoir exactement quels assemblages sont requis par votre projet et d'avoir un script ou une action automatisée similaire qui assure que tous les composants requis sont présents, soit Après avoir construit, ou plus probable lorsque vous faites un programme d'installation, ou de recueillir des fichiers pour la distribution,

+0

Recommandez-vous d'utiliser des événements post-build pour cela? – Fadeproof

+0

Je ne les ai pas utilisés, donc je ne peux pas dire oui ou non. Dans le cas où j'avais, j'ai eu un script NSIS qui a généré l'installateur pour l'outil que j'écrivais (une application visuelle). Plutôt que d'inclure simplement * .dll dans le programme d'installation, je l'ai mis à jour pour inclure chaque assembly par son nom, de sorte que j'ai été averti s'il en manquait. – xan

+0

... cont. Il a également obtenu l'assembly correct d'ailleurs s'il était manquant pour que la génération du programme d'installation n'échoue pas, mais il a averti que VS n'avait pas copié le fichier .dll dont j'avais besoin. – xan

10

Après avoir posé cette question sur MSDN here - il semble que ce comportement est voulu par la conception. "Si vous déployez/copiez une application qui contient une référence à un composant personnalisé enregistré dans le GAC, le composant ne sera pas déployé/copié avec l'application, quel que soit le paramètre Copy Local."

+0

VS 2015 fait une exception à cela pour les références indirectes via une référence de projet. Par exemple VS 2010 ne se comporte pas comme ça. https://connect.microsoft.com/VisualStudio/Feedback/Details/1804765 – vezenkov

31

Malheureusement, il semble que selon la déclaration suivante tirée du MSDN documentation la fonctionnalité CopyLocal ne fonctionne pas comme prévu pour les assemblages déjà dans le GAC.

Si vous déployez une application qui contient une référence à un composant personnalisé enregistré dans le GAC, le composant ne sera pas déployé avec l'application, quel que soit le paramètre CopyLocal. Dans les versions précédentes de Visual Studio, vous pouviez définir la propriété CopyLocal sur une référence pour vous assurer que l'assembly était déployé. Maintenant, vous devez ajouter manuellement l'assembly dans le dossier \ Bin. Cela met tout le code personnalisé sous surveillance, ce qui réduit le risque de publier du code personnalisé avec lequel vous n'êtes pas familier.

Plus d'informations peuvent être trouvées à la page suivante qui explique les détails sur le fonctionnement des références de projet.

MSDN: Project References

+0

J'ai ajouté un lien ci-dessous à un message que j'ai fait sur le forum DataDynamics ActiveReports for .NET 3.0 concernant ce même problème en ce qui concerne les DLL déployées avec Active rapports. Bizarrement, j'ai trouvé que ce comportement supposé "par conception" semble dépendre de la référence de la bibliothèque, par exemple WPFToolkit.dll semble copier dans le dossier bin, que ce soit par le biais d'une référence secondaire. http://www.datadynamics.com/forums/124306/ShowPost.aspx – jpierson

7

Il y a une astuce: définissez la copie de référence locale à false, puis de nouveau à vrai, et Visual Studio ajoute les métadonnées privé automatiquement cette référence. Au moins VS 2010 fait. J'ai récemment fait ceci pour résoudre un problème avec notre serveur TFS Build qui, pour une raison étrange, avait de nombreux composants Enterprise Library installés dans le GAC, donc nous avons eu des problèmes majeurs lors du déploiement de notre projet à partir du dossier TFS Drop. Ce truc faux/vrai nous a sauvés.

+1

Ne fonctionne pas dans VS 2013. –

+0

Cela a fonctionné sur ma machine mais pas sur notre serveur de build. Il semble que je ne puisse pas retirer mon upvote. – arkod

+0

Si cela ne marche pas sur les nouvelles éditions de VS, alors je suppose que nous n'avons pas d'autre choix que de modifier manuellement les fichiers du projet pour ajouter "copier local" aux références dans le fichier XML du projet. paramètres de référence dans Visual Studio lui-même. Mais je vais devoir enquêter plus, peut-être même que cette correction manuelle ne suffira pas si Microsoft a changé le comportement de base de msbuild depuis VS 2010 ... – JustAMartin

0

J'ai constaté que cela n'est plus respecté dans Visual Studio 2015 avec des références de projet si le projet référencé a une dépendance à un assembly GAC. L'assembly GAC est toujours copié dans la sortie du projet racine et la copie locale = false n'est respectée que pour la sortie du projet contenant la référence à la DLL GAC.

Connect feedback

Questions connexes