72 votes

Copier les dépendances d'une DLL dans Visual Studio

Comment puis-je configurer un projet dans Visual Studio pour copier les DLL tierces dont dépendent l'une des références du projet ?

J'ai un projet d'application principal et une bibliothèque de classes DLL. L'application principale fait référence à la bibliothèque de classes DLL, et la DLL elle-même fait référence à des DLL tierces. Lorsque je compile l'application principale, elle copie automatiquement la bibliothèque de classes DLL dans son répertoire de sortie, mais elle ne copie pas les DLL tierces.

Je ne veux pas ajouter de références aux DLL tierces à partir du projet de l'application principale car l'application principale ne les utilise pas, elles sont uniquement utilisées par la bibliothèque de classe.

0 votes

Créez un événement post-construction qui copie les DLL, vous n'avez pas besoin de créer un projet juste pour faire cela.

1 votes

Cette méthode me permet de séparer les dépendances réelles de l'application principale des dépendances de la bibliothèque de classes. Dommage qu'il n'y ait pas une méthode automatique (qui n'introduise pas de psuedo références dans l'application principale).

41voto

Brian Points 1175

Vous pouvez y parvenir avec la fenêtre des propriétés du projet. Visual Studio vous permet de définir des événements qui se produisent, avant ou après la construction. Pour accéder à la fenêtre des propriétés du projet, il suffit de cliquer avec le bouton droit de la souris sur votre projet dans la fenêtre de l'explorateur de solutions et de cliquer sur "Propriétés". Dans la partie gauche, allez sur l'onglet "build events".

Dans la boîte post-build, tapez quelques commandes de copie. Par exemple :

copy "$(SolutionDir)mydll.dll" "$(TargetDir)"

$(SolutionDir) y $(TargetDir) sont toutes deux des variables prédéfinies. La syntaxe standard est la suivante :

copy "source directory and file name" "destination directory"

Si vous cliquez sur le bouton "edit post build...", une boîte apparaîtra avec une liste de variables prédéfinies que vous pouvez insérer (comme par exemple $(SolutionDir) y $(TargetDir) )

En outre, ce processus est utile pour copier d'autres fichiers, tels que les fichiers de configuration personnalisés, les images ou toute autre dépendance que votre projet peut avoir.

6 votes

La copie peut-elle contenir des caractères génériques, comme dans copy SOME_DIRECTORY*.dll $(TargetDir) ?

0 votes

J'ai exactement le même scénario que l'OP, mais le projet d'application principal ne copie pas les données de l'application. copy d des fichiers .dll.

1 votes

A quoi servent les citations ? Cela ne fonctionne pour moi qu'en supprimant les guillemets (VS2017).

29voto

sergtk Points 3109

Le fragment suivant fonctionne pour moi :

<Project>
  ...
  <ItemGroup>
    <Content Include="Path\to\dll\dllname.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
  ...
</Project>

Cela fonctionne pour le C#. Pour le C++ natif, il copie toujours la dll dans le dossier de sortie, mais cette dépendance n'est pas visible dans Visual Studio, elle doit être éditée directement dans le fichier du projet.

Pour tester sur un exemple non trivial J'ai essayé d'exécuter le projet C# A qui dépend du projet C++ natif B. Le projet B dépend d'une dll native tierce C - cette dépendance est implémentée via le fragment ci-dessus dans le fichier du projet. Lorsque je construis A, C est copié dans le dossier binaire.

Je l'ai essayé dans Visual Studio 2010.

0 votes

Cela inclut le répertoire complet, mais j'ai besoin d'une seule bibliothèque.

2 votes

C'est comme ça que je copie simple dllname.dll est un fichier, pas un dossier.

3 votes

Ceci copie toute la structure du répertoire dans bin. comme bin \Path\to\dll\dllname.dll Il veut avoir un bac \dllname.dll

6voto

Anuroopa Shenoy Points 143

Jetez un coup d'œil à cette solution fournie par Alex Yakunin. http://blog.alexyakunin.com/2009/09/making-msbuild-visual-studio-to.html Cela a très bien fonctionné pour moi - le scénario étant que les bibliothèques DevExpress utilisées expressément avaient d'autres dépendances qui ont causé des problèmes lors du déploiement).

  • Note 1 : Visual studio 2010 semble ajouter les dlls référencées automatiquement, mais msbuild ne l'a pas fait. Donc la solution d'Alex a fonctionné puisque les scripts de la version utilisent msbuild.
  • Note 2 : J'ai également dû m'assurer que pour les bibliothèques référencées (celles qui étaient référencées dans le code) copy-local était réellement défini sur True dans le csproj, même si l'explorateur de solutions indiquait que c'était le cas. La meilleure façon de procéder est de définir copy-local = False, Enregistrer, définir copy-local = True, Enregistrer.

Ces deux étapes - copy-local=true pour les bibliothèques référencées et l'ajout de cibles msbuild pour les références indirectes ont automatisé la configuration de la construction pour moi.

1 votes

Le fichier n'est plus disponible sur ce poste

0 votes

La page est maintenant 404. Voir plutôt : web.archive.org/web/20180521114840/http://blog.alexyakunin.com/

3voto

Richard Berg Points 14218

Je ne recommande pas de faire cela. Vous vous retrouvez avec une explosion de N^2 du nombre d'assemblages copiés (et potentiellement, reconstruits). Si possible, vous devriez faire en sorte que tous vos projets placent leurs assemblages dans le même $(OutDir). Si vous utilisez TFS, Team Build le fait pour vous.

3 votes

En fait, tous nos assemblages sont placés dans un seul répertoire. Mon application principale y fait référence, et lorsque je construis, elle les copie automatiquement de ce répertoire vers bin/Debug. Je voulais un moyen pour que les dépendances des dépendances soient également copiées.

2voto

Curtis Yallop Points 639

Allez dans l'application principale, références, à la référence de votre classe-bibliothèque.

Définissez "Copie locale" sur Vrai.

Il va maintenant copier le répertoire bin de votre bibliothèque de classes dans le répertoire bin de l'application principale. Y compris toutes les dll tierces de sous-dépendance.

5 votes

Cela copiera la bibliothèque tierce dans le répertoire bin de la bibliothèque de classe, mais pas dans le répertoire de sortie final.

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