web-dev-qa-db-fra.com

Comment faire pour que Visual Studio copie un fichier DLL dans le répertoire de sortie?

J'ai un projet Visual Studio C++ qui s'appuie sur un fichier externe DLL. Comment faire pour que Visual Studio copie ce fichier DLL automatiquement dans le répertoire de sortie (debug/release) quand je construis le projet?

93
Mat

Utilisez une action post-build dans votre projet et ajoutez les commandes pour copier la DLL incriminée. Les actions post-build sont écrites sous forme de script batch.

Le répertoire de sortie peut être référencé comme $(OutDir). Le répertoire du projet est disponible sous la forme $(ProjDir). Essayez d’utiliser des chemins relatifs, le cas échéant, pour pouvoir copier ou déplacer votre dossier de projet sans interrompre l’action post-génération.

87
Adrien Plisson

$ (OutDir) s’est avéré être un chemin relatif dans VS2013, j’ai donc dû le combiner avec $ (ProjectDir) pour obtenir l’effet souhaité:

xcopy /y /d  "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"

En passant, vous pouvez facilement déboguer les scripts en ajoutant "echo" au début et en observant le texte développé dans la fenêtre de sortie de la construction.

37
Nesho Neshev

Les détails de la section des commentaires ci-dessus ne fonctionnaient pas pour moi (VS 2013) lorsque je tentais de copier la DLL de sortie d'un projet C++ dans le dossier d'édition et de débogage d'un autre projet C # au sein de la même solution.

J'ai dû ajouter l'action suivante post-build (clic droit sur le projet qui a une sortie .dll) puis propriétés -> propriétés de configuration -> événements de construction -> événement post-build -> ligne de commande

maintenant, j'ai ajouté ces deux lignes pour copier la DLL de sortie dans les deux dossiers:

xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug
7
Sebastian

(Cette réponse s'applique uniquement à C # pas à C++, désolée d'avoir mal interprété la question d'origine)

J'ai traversé DLL comme avant. Ma dernière solution consistait à stocker les DLL non gérées dans la DLL gérée sous forme de ressources binaires, à les extraire dans un dossier temporaire lors du lancement du programme et à les supprimer lors de leur élimination.

Cela devrait faire partie de l’infrastructure .NET ou pinvoke, car elle est très utile .... Cela facilite la gestion de votre DLL gérée, à la fois sous Xcopy ou une référence de projet dans une plus grande solution Visual Studio. Une fois que vous faites cela, vous n'avez plus à vous soucier des événements post-build.

MISE À JOUR:

J'ai posté le code ici dans une autre réponse https://stackoverflow.com/a/11038376/364818

4
Mark Lakata
xcopy /y /d  "$(ProjectDir)External\*.dll" "$(TargetDir)"

Vous pouvez également vous référer à un chemin relatif. L’exemple suivant trouvera le DLL dans un dossier situé un niveau au-dessus du dossier du projet. Si vous avez plusieurs projets utilisant le DLL dans une solution unique, cela place la source du DLL dans une zone commune accessible lorsque vous définissez l'un d'entre eux en tant que projet de démarrage.

xcopy /y /d  "$(ProjectDir)..\External\*.dll" "$(TargetDir)"

L'option /y Copie sans confirmation. L'option /d Vérifie si un fichier existe dans la cible et si elle ne copie que si la source a un horodatage plus récent que la cible.

J'ai trouvé que dans au moins les versions les plus récentes de Visual Studio, telles que VS2109, $(ProjDir) n'était pas défini et devait utiliser $(ProjectDir) à la place.

Si vous omettez un dossier cible dans xcopy, le répertoire de sortie devrait par défaut. Cela est important pour comprendre la raison $(OutDir) seule n'est pas utile.

$(OutDir), du moins dans les versions récentes de Visual Studio, est défini comme un chemin relatif vers le dossier de sortie, tel que bin/x86/Debug. L’utiliser seul comme cible créera un nouvel ensemble de dossiers à partir du dossier de sortie du projet. Ex: … bin/x86/Debug/bin/x86/Debug.

La combinaison avec le dossier de projet devrait vous amener au bon endroit. Ex: $(ProjectDir)$(OutDir).

Cependant $(TargetDir) fournira le répertoire de sortie en une étape.

Liste de macros MSBuild de Microsoft pour les versions actuelles et précédentes de Visual Studio

0
Rich Shealer