web-dev-qa-db-fra.com

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

J'ai quelques fichiers DLL dans le dossier\lib de mon dossier de projet. Dans la page de propriétés de dll, j'ai sélectionné "Action de construction" comme "Contenu" et "Copier dans le répertoire de sortie" comme étant "Copier toujours".

Après la construction, je suis en train de faire copier la dll, mais ils se trouvent dans\bin\Release\lib et non dans\bin\Release.

Existe-t-il un moyen de copier des fichiers dll dans\bin\Release (et non dans\bin\Release\lib) sans écrire de script post-build ni recourir à nant, etc.?

85
OhDear

au lieu de <Content> utilisation <ContentWithTargetPath> et spécifiez le chemin cible, comme ceci:

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

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

207
Daniel Zeitlin

Conservez-les dans $(ProjectDir)\Lib, mais ajoutez ces fichiers " en tant que lien " à la racine de votre fichier .csproj. Maintenant, ils seront copiés dans bin\Debug (ou tout autre dossier de sortie) sans être dans lib.

EDIT: Cette réponse a été écrite quand ContentWithTargetPath n'était pas disponible dans les versions de VS/MSBuild que j'utilisais. Laissant cette réponse ici pour les personnes susceptibles d'utiliser une ancienne version de VS. Arrêtez de commenter, s'il vous plaît, nous savons tous qu'il existe de meilleurs moyens maintenant.

24
Ani

Ajoutez les fichiers dll en tant que référence au projet et sur le jeu de références "Copy local" sur true.

7

Si votre objectif principal est d'inclure des DLL sans encombrer le répertoire racine du projet, une autre solution consiste à déplacer les DLL vers un projet partagé séparé et l'ajouter en tant que une référence dans le projet d'origine.

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

Pas

  • Cliquez avec le bouton droit sur votre Solution -> Add -> New Project -> Shared Project
  • Ajouter les DLL à ce projet (dans le répertoire racine de ce projet, pas dans un sous-dossier "lib")
  • (Vérifiez DLL sont définies correctement, par exemple Build Action: Content et Copy to Output Directory: Copy Always)
  • Cliquez avec le bouton droit sur le projet d'origine References -> Add Reference -> Shared Projects
  • Sélectionnez le projet partagé que vous avez créé précédemment

La configuration ressemble à ceci:

solution-Explorer-screenshot

3
sonny

Il semble dans VisualStudio 2015 que si les dll que vous "ajoutez avec un lien" sont dans un sous-dossier de ce même projet - elles seront automatiquement placées dans un dossier et la sortie sera également placée dans un dossier. comme tu as vu.

Si les dll sont dans un autre projet ou répertoire sur le disque pas dans un sous-dossier du projet, vous pouvez 'Ajouter avec un lien' et elles seront correctement placées dans le répertoire racine.

3
DefenestrationDay

Une autre méthode consiste simplement à laisser les éléments de type None. Dans l'explorateur de solutions, cliquez sur ceux que vous souhaitez déployer et définissez la propriété Content sur True.

Remarque: je l'ai fait dans VS2019, et les choses peuvent changer d'une version à l'autre.

Pour que cela fonctionne, maintenant, faites un clic droit sur votre projet et sélectionnez "Décharger le projet". Cliquez ensuite avec le bouton droit sur le projet non chargé et sélectionnez "Editer nom_projet.vcxproj".

Dans l'éditeur, allez jusqu'au bas du fichier et insérez cette cible juste avant la balise de fin </Project>:

  <Target Name="CopyContent" AfterTargets="Build">
    <Copy SourceFiles="@(None)" Condition="'%(None.DeploymentContent)' == 'true'" DestinationFolder="$(OutputPath)" ContinueOnError="true" />
  </Target>

Maintenant, faites un clic droit sur le projet non chargé et sélectionnez "Recharger le projet". Sélectionnez pour enregistrer et fermer si vous y êtes invité.

Je règle également le OutputDirectory sur:

$(SolutionDir)bin\$(Configuration)\$(Platform)\

et le IntermediateDirectory à:

$(SolutionDir)obj\$(Configuration)\$(ProjectName)\$(Platform)\

dans la page Propriétés générales du projet. Cela place la sortie dans un dossier "bin" et les intermédiaires dans un dossier "obj" à la racine de votre solution.

Remarque: la $(SolutionDir) n'est pas définie lorsque vous exécutez MSBuild à partir de la ligne de commande. Vous pouvez utiliser une astuce pour définir cela dans le dossier où réside le fichier .sln à l'aide de GetDirectoryNameOfFileAbove. (Gauche En 2019, ils ont tout de même l'air de gérer cela correctement sur la ligne de commande. Yeah:) La $(SolutionDir) contient une barre oblique inverse de fin, donc aucun après. Les résultats de chacun doivent comporter une barre oblique inverse.

Maintenant, si vous possédez Pro ou une version ultérieure, veuillez ne pas le faire à chaque fois que vous devez créer un projet. Ce serait boiteux. Au lieu de cela, une fois que vous avez configuré votre projet comme vous le souhaitez, sélectionnez Project -> Export Template. Vous lui donnez un nom, et la prochaine fois que vous voulez créer un projet identique à celui-ci, choisissez ce nom dans la boîte de dialogue Nouveau projet. (Dans l'ancienne version, je pense que c'était Files -> Export Teamplate....)

0
ChuckEng

Si vous devez copier des fichiers du répertoire Libs dans le dossier racine 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>
0
dev-siberia