160 votes

Visual Studio : Comment "Copier dans le répertoire de sortie" sans copier la structure du dossier ?

J'ai quelques fichiers dll dans \lib du dossier de mon projet. Dans la page de propriétés de la dll, j'ai sélectionné "Build Action" comme "Content" et "Copy to Output Directory" comme "Copy always".

Après la construction, je reçois les dll copiées mais elles sont à l'intérieur. \bin\Release\lib et non dans \bin\Release.

Existe-t-il un moyen de copier des fichiers dll vers \bin\Release (et non pas à \bin\Release\lib ) sans écrire un script post-build ou avoir recours à nant etc ?

333voto

Daniel Zeitlin Points 3346

Au lieu de <Content> utiliser <ContentWithTargetPath> et spécifier le chemin cible, comme ceci :

<ItemGroup>
  <ContentWithTargetPath Include="lib\some_file.dat">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <TargetPath>some_file.dat</TargetPath>
  </ContentWithTargetPath>
  <None Include="lib\some_file.dat" />
</ItemGroup>

Notez que cette entrée peut ne pas être visible depuis Visual Studio (2012, 2015, 2017), mais une fois ajoutée manuellement au csproj, elle apparaîtra dans Visual Studio. Le chemin cible ne sera cependant pas modifiable via l'interface utilisateur.

Ajout d'un <None> pour le fichier permettra de s'assurer qu'il apparaîtra toujours dans l'interface utilisateur de Visual Studio.

30voto

ananthonline Points 7431

Gardez-les dans $(ProjectDir)\Lib mais ajoutez ces fichiers " Comme un lien "à la racine de votre .csproj. Maintenant, ils seront copiés dans le répertoire bin \Debug (ou tout autre dossier de sortie) sans être dans lib.

EDIT : Cette réponse a été écrite à l'époque où ContentWithTargetPath n'était pas disponible dans les versions de VS/MSBuild que j'utilisais. Je laisse cette réponse ici pour les personnes qui pourraient avoir à utiliser une ancienne version de VS. S'il vous plaît arrêter de commenter sur ce sujet, nous savons tous qu'il ya de meilleures façons maintenant.

20voto

sonny Points 1444

Si votre intention principale est d'inclure les DLL sans encombrer le répertoire racine du projet, une autre solution consiste à déplacer les DLL dans un projet partagé distinct et l'ajouter comme référence dans le projet original.

(Notez que ce post ne répond pas directement à cette question car il ne préserve pas la structure du dossier et du projet, mais j'ai trouvé cette approche utile parce que j'ai pu restructurer mon projet dans mon cas et parce que je voulais éviter certains des inconvénients des autres approches ici).

Étapes

  • Cliquez avec le bouton droit de la souris sur votre Solution -> Add -> New Project -> Shared Project
  • Ajoutez les DLLs à ce projet (dans le répertoire racine de ce projet, pas dans un sous-dossier "lib").
  • (Vérifiez que les propriétés du fichier DLL sont correctement configurées, par ex. Build Action: Content y Copy to Output Directory: Copy Always )
  • Cliquez à droite sur l'icône du projet original References -> Add Reference -> Shared Projects
  • Sélectionnez le projet partagé que vous avez créé plus tôt

La configuration ressemble à ceci :

solution-explorer-screenshot

8voto

erik_nw Points 789

Ajoutez les fichiers dll comme référence au projet, et sur la référence, mettez "Copy local" à true.

7voto

dev-siberia Points 301

Si vous devez copier des fichiers du répertoire Libs vers le dossier Root VS2017 :

<ItemGroup Condition="'$(Platform)' == 'x64'">
    <None Include="Libs\x64\**" Link="\%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x86'">
    <None Include="Libs\x86\**" Link="\%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

Vers tout autre dossier, y compris le dossier Libs(RecursiveDir)

<ItemGroup Condition="'$(Platform)' == 'x86'">
    <None Include="Libs\x86\**" Link="mycustomfolder\%(RecursiveDir)%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

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