web-dev-qa-db-ja.com

Visual Studio:フォルダ構造をコピーせずに「出力ディレクトリにコピー」する方法

プロジェクトフォルダーの\ libフォルダーにいくつかのdllファイルがあります。 dllのプロパティページで、[ビルドアクション]を[コンテンツ]として、[出力ディレクトリにコピー]を[常にコピー]として選択しました。

ビルド後、実際にdllをコピーしていますが、それらは\ bin\Release\libの中にあり、\ bin\Releaseの中にはありません。

ビルド後のスクリプトを記述したり、nantなどに頼ることなく、dllファイルを\ bin\Releaseにコピーする方法はありますか(\ bin\Release\libにではありませんか)?

85
OhDear

<Content>の代わりに<ContentWithTargetPath>を使用して、次のようにターゲットパスを指定します。

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

このエントリはVisual Studio(2012、2015、2017)からは表示されない可能性がありますが、csprojに手動で追加すると、Visual Studioに表示されることに注意してください。ただし、ターゲットパスはUIを介して編集できません。

207
Daniel Zeitlin

それらを$(ProjectDir)\Libに保持しますが、それらのファイルを.csprojのルートに「 リンクとして 」追加します。これで、libに入らずにbin\Debug(または他の出力フォルダー)にコピーされます。

編集:この答えは、私が使用していたVS/MSBuildのバージョンでContentWithTargetPathが利用できなかったときに書かれた方法です。古いバージョンのVSを使用する必要があるかもしれない人々のために、この回答をここに残してください。これについてのコメントを停止してください、私たちは皆、今より良い方法があることを知っています。

24
Ani

Dllファイルをプロジェクトへの参照として追加し、参照セットで「ローカルにコピー」をtrueに設定します。

プロジェクトのルートディレクトリを乱雑にすることなくDLLを含めることが主な目的である場合、別の解決策はDLLを別の共有プロジェクトに移動し、これを元のプロジェクトの参照。

(この投稿はフォルダとプロジェクトの構造を保持しないため、この質問に直接答えないことに注意してください。しかし、私の場合はプロジェクトを再構築することができ、一部のここでの他のアプローチの欠点。)

手順

  • Solution -> Add -> New Project -> Shared Projectを右クリックします
  • DLLをこのプロジェクトに追加します(「lib」サブフォルダーではなく、このプロジェクトのルートディレクトリに)
  • (DLLファイルプロパティが正しく設定されていることを確認します。例:Build Action: ContentおよびCopy to Output Directory: Copy Always
  • 元のプロジェクトのReferences -> Add Reference -> Shared Projectsを右クリックします
  • 前に作成した共有プロジェクトを選択します

セットアップは次のようになります。

solution-Explorer-screenshot

3
sonny

VisualStudio 2015では、「リンクで追加する」dllが同じプロジェクトのサブフォルダー内-フォルダーに自動的に配置され、出力もフォルダーに配置されるようですあなたが見たように。

Dllがディスク上の別のプロジェクトまたはディレクトリにある場合プロジェクトのサブフォルダではないの場合、「リンクで追加」することができ、ルートディレクトリに配置されます。

3

別の方法は、アイテムをNoneタイプのままにすることです。ソリューションエクスプローラーで、展開するものをクリックし、ContentプロパティをTrueに設定します。

注:VS2019でこれを行いましたが、バージョンごとに状況が変わる可能性があります。

これを機能させるには、プロジェクトを右クリックして、「プロジェクトのアンロード」を選択します。次に、アンロードされたプロジェクトを右クリックし、「project_name.vcxprojの編集」を選択します。

エディターで、ファイルの最後まで移動し、このターゲットを末尾の</Project>タグの直前に挿入します。

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

次に、アンロードされたプロジェクトを右クリックして、「プロジェクトのリロード」を選択します。プロンプトが表示されたら、保存して閉じることを選択します。

OutputDirectoryも以下に設定します。

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

およびIntermediateDirectoryには:

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

[プロジェクトプロパティ]の[全般]ページ。これにより、出力が「bin」フォルダーに、中間体がソリューションのルートの「obj」フォルダーに配置されます。

注:コマンドラインからMSBuildを実行する場合、$(SolutionDir)は定義されません。 GetDirectoryNameOfFileAboveを使用して、.slnファイルが存在するフォルダーにそれを定義するために使用できるトリックがあります。 (読者のための演習として残された)。また、2019年にはコマンドラインでとにかくこれを正しく処理しているようです。ええ:)$(SolutionDir)には末尾のバックスラッシュが含まれているため、その後にバックスラッシュはありません。それぞれの結果には、末尾にバックスラッシュが必要です。

現在、Pro以上を所有している場合は、プロジェクトを作成する必要があるたびにこれを実行しないでください。それはラメだろう。代わりに、プロジェクトを好きなようにセットアップしたら、Project -> Export Templateを選択します。名前を付けて、次にそのプロジェクトと同じようなプロジェクトを作成する場合は、[新しいプロジェクト]ダイアログでその名前を選択します。 (古いバージョンでは、これはFiles -> Export Teamplate...だったと思います。)

0
ChuckEng

Libsディレクトリからルートフォルダー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>

Libs(RecursiveDir)フォルダーを含む他のフォルダーへ

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