web-dev-qa-db-fra.com

Copie des dépendances d'une DLL dans Visual Studio

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

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

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

62
M. Dudley

Vous pouvez y parvenir avec la fenêtre des propriétés du projet. Visual Studio vous permet de définir les événements qui doivent se produire, avant ou après la construction. Pour accéder à la fenêtre des propriétés du projet, faites simplement un clic droit sur votre projet dans la fenêtre de l'Explorateur de solutions et cliquez sur "propriétés". Dans la partie gauche, accédez à l'onglet "Créer des événements".

Dans la zone post-build, tapez quelques commandes de copie. Par exemple:

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

$(SolutionDir) et $(TargetDir) sont tous 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 "éditer le post-build ...", une boîte contenant une liste de ces variables prédéfinies que vous pourrez insérer (comme $(SolutionDir) et $(TargetDir)) s'affichera.

En guise de remarque, il s'agit d'un processus utile pour copier d'autres fichiers, tels que des fichiers de configuration personnalisés, des images ou toute autre dépendance que votre projet peut avoir.

37
Brian

Le fragment suivant fonctionne pour moi:

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

Cela fonctionne pour 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 modifiée directement dans le fichier de 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. Les projets B dépendent de la DLL native tierce C - cette dépendance est implémentée via le fragment ci-dessus dans le fichier de projet. Lorsque je crée A, C est copié dans un dossier binaire.

Je l'ai essayé dans Visual Studio 2010.

23
sergtk

Jetez un oeil à 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 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)

  • Remarque 1: Visual studio 2010 semble ajouter automatiquement des DLL référencées, contrairement à msbuild. La solution d'Alex a donc fonctionné depuis que les scripts de version utilisaient msbuild.
  • Remarque 2: Il fallait également s'assurer que pour les bibliothèques référencées (celles qui étaient référencées dans le code), copy-local était effectivement défini sur True dans le csproj, même si l'Explorateur de solutions l'avait indiqué. La meilleure façon est de définir copy-local = False, Save, de définir copy-local = True, Save.

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.

6
Anuroopa Shenoy

Je n'aime pas que mes fichiers de dépendance se trouvent dans le dossier racine du projet mais dans un sous-dossier. Mais les fichiers doivent être placés dans le dossier racine du dossier de génération.

Mes événements de build ressemblent à ceci:

enter image description here

enter image description here

enter image description here

 Command: call xcopy /S /Y "$(SolutionDir)Dependencies\*.*" "$(TargetDir)"

Dans le cas où "Dépendances" contient également des sous-dossiers, comme le mien.

2
MrCalvin

Je ne recommanderais pas de faire ça. Vous vous retrouvez avec une explosion de N ^ 2 dans le nombre d'assemblages copiés (et potentiellement reconstruits). Si possible, tous vos projets doivent placer leurs assemblages dans le même $ (OutDir). Si vous utilisez TFS, Team Build le fait pour vous.

2
Richard Berg

Accédez à l'application principale, références, à votre référence de bibliothèque de classes.

Définissez "Copier local" sur True.

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.

2
Curtis Yallop