79 votes

Quand faut-il mettre copy-local à true et quand ne le faut-il pas ?

Je me demande s'il existe une méthode heuristique pour déterminer quand il faut définir copy-local=true pour les références ?

Si les types référencés ne sont utilisés qu'en interne, puis-je définir le paramètre copy-local a true mais si les types référencés sont exposés en tant que paramètres ou valeurs de retour, je mets copy-local a false et indiquer qu'une version spécifique de la dépendance doit être référencée lorsque ma bibliothèque doit être utilisée ?

Quelqu'un peut-il m'éclairer à ce sujet ?

73voto

JaredPar Points 333733

La copie locale est importante pour les scénarios et les outils de déploiement. En règle générale, vous devez utiliser CopyLocal=True si la référence n'est pas contenue dans le GAC.

Copie locale signifie essentiellement que je dois déployer manuellement cette DLL pour que mon application fonctionne. Lorsqu'il est faux, cela signifie essentiellement "Je dépend d'un autre composant qui doit être installé séparément ou en chaîne, la DLL sera juste déjà là".

22voto

Copy local a été implémenté réellement pour supporter le débogage local. Lorsque vous préparez votre application pour l'empaqueter et la déployer, vous devez construire vos projets dans le même dossier de sortie et vous assurer que toutes les références dont vous avez besoin s'y trouvent.

CopyLocal est particulièrement pénible lors de la construction de grands arbres de sources. Il y avait une question connexe sur la façon de désactiver CopyLocal ici sur SO, vous pouvez la consulter à l'adresse suivante Comment puis-je remplacer le paramètre CopyLocal (Private) pour les références dans .NET à partir de MSBUILD ? . Ainsi que Meilleures pratiques pour les grandes solutions dans Visual Studio (2008).

J'ai écrit sur la manière de gérer la construction de grands arbres de sources dans l'article MSBuild : Meilleures pratiques pour créer des builds fiables, partie 2 .

Donc, en résumé, je dirais qu'il faut désactiver CopyLocal lorsque la copie de fichiers prend plus de temps que ce que vous êtes prêt à dépenser pour chaque construction.

15voto

Kent Boogaart Points 97432

Il s'agit en fait de l'environnement cible. Si copy local est faux, cela signifie que l'assemblage existe déjà dans l'environnement cible (normalement dans le GAC). En le mettant à true, vous vous assurez qu'il apparaîtra dans la sortie de votre build, ce qui facilite le déploiement dans l'environnement cible.

8voto

jpierson Points 3871

Consultez la référence MSDN suivante qui explique en détail le comportement de CopyLocal.

Références du projet

Malheureusement, il y a quelques bizarreries et CopyLocal ne fonctionnera pas nécessairement comme prévu pour les références d'assemblages dans les assemblages secondaires structurés comme indiqué ci-dessous.

  • MainApp.exe
    • MyLibrary.dll
      • ThirdPartyLibrary.dll (si dans le GAC CopyLocal ne copiera pas dans le dossier bin de MainApp)

Cela rend les déploiements par xcopy difficiles si vous ne prévoyez pas d'installer l'assemblage tiers dans le GAC de la machine cible.

2voto

Mehrdad Afshari Points 204872

Cette option n'affecte que la phase de construction. Elle copie simplement la référence dans le répertoire local de l'assemblage construit.

Si un autre assemblage (T) veut utiliser une méthode de l'assemblage que vous construisez (A) qui a un type de retour ou des paramètres d'un autre assemblage référencé (R), il (T) devrait pouvoir accéder à cet assemblage (R). Il peut le faire sans rien faire de spécial si l'assemblage référencé (R) est installé dans le GAC. Sinon, il a besoin d'une copie locale de cet assemblage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X