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


111

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

ビルド後、私は実際にdllをコピーしていますが、それらは\ bin \ Releaseではなく\ bin \ Release \ lib内にあります。

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

回答:


255

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

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

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


2
VS 2015でContentWithTargetPathがビルドアクションオプションとして表示されません。それを追加する方法はありますか?
Kim

1
.csprojファイルに手動でエントリを追加すると、IDEのオプションとして表示されます。ただし、IDEからターゲットパスを編集することはできません。
Kim

9
私の唯一の心配は、VS2015 UIがこのオプションまたはTargetPathプロパティを表示しないため、これがMSBuild / .NET / Visual Studio / Whateverの将来のバージョンでサポートされなくなることです。
MarioDS 2016年

1
これは私にとってはうまくいきます。他の答えはどれもうまくいきません。これが答えです。
GunWanderer 2017年

1
ContentWithTargetPathブレークインクリメンタルコンパイルの使用(VS 2017 15.9.9でテスト済み)
Mads Ravn

26

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

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


4
ananthonlineに感謝します。私はあなたの手順を試しましたが、それは助けにはなりませんでした。何か間違っているのかもしれません。これが私がやっていることです、何かが間違っていると思われる場合は修正してください。libからdllを選択し、「リンクとして」追加します。3. dllを右クリックし、「出力ディレクトリにコピー」で「常にコピー」を再度選択します。4.クリーン&再構築。結果:私はこれらのDLLを\ bin \ release \ libに再度取得しました
OhDear

1
構成後にソリューションフォルダーのスクリーンショットを投稿してください
Ani

3
すでにプロジェクトツリーにあるファイルへのリンクを追加しようとすると、拒否され、代わりにファイルがプロジェクトに再び含まれます...
Nyerguds

1
@Nyergudsと同様に、すでにプロジェクトツリーにあるファイルへのリンクを追加できないので、この回答では質問を解決できません。
Østergaardとれ

1
ソリューションエクスプローラーのプロジェクトディレクトリのルートをあふれさせませんか?このようなファイルが多数あると、問題になる可能性があります。通常、プロジェクトディレクトリのルートには、さまざまなファイルが含まれています。
Alex34758 2018年

10

プロジェクトのルートディレクトリを乱雑にせずに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
  • 以前に作成した共有プロジェクトを選択します

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

ソリューションエクスプローラーのスクリーンショット


2
プロジェクトをすっきりさせるための、はるかにシンプルでエレガントなソリューション。
Ravi Ganesh、

UAPファイルと* .binファイルで動作させることができませんでした。
マッテオ

7

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


1
エリック、ありがとう。これは、参照として追加できない1つのDLLを除いて、完全に機能します。参照として追加中に発生するエラーは、「libeay32.dll」への参照を追加できませんでした。ファイルがアクセス可能であり、有効なアセンブリまたはCOMコンポーネントであることを確認してください。
OhDear 2013

7
@MAnthony:.NETアセンブリまたはCOM相互運用機能アセンブリのみをプロジェクト参照として追加できます。ネイティブDLLはできません。DLLを\ bin \ Releaseにコピーする他の方法を見つける必要があります。
Michael Liu

エリックとマイケル、そしてananthonlineに感謝します。必要な評判ポイントがないため、回答やコメントに賛成投票できません。
OhDear、2013

1
アンマネージDLLの場合、以下に提案した方法を使用する必要があります。
Ani

4

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>

3

VisualStudio 2015 では、「リンクを使用して追加する」DLLが同じプロジェクトのサブフォルダーにある場合、それらは自動的にフォルダーに配置され、出力も見たようなフォルダーに配置されます。

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


VS2012でも同じです。リンクを拒否し、コンテンツとして追加するだけです。悲しいことに、最も簡単な解決策は、プロジェクトのルートにそれらをダンプすることです。
Nyerguds

0

別の方法は、項目をタイプのままにすること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」フォルダーに配置されます。

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

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


-1

Visual Studio 2010 / C#プロジェクトでも同じ問題が発生しました。

アセンブリ(つまり.NETインターフェイスを持つ)の場合は、ソリューションエクスプローラーのプロジェクトの下にある「参照」フォルダーを使用します。それを右クリックして、「既存のアイテムを追加」を選択し、.dllアセンブリを見つけます。

一般的な.dllファイルはサブフォルダーに配置でき(「\ lib」は前述のとおり)、プロパティで次のように選択します。

  • ビルドアクション= "HelpFiles"
  • OutputDirectory = "If Newer"にコピー

これは希望どおりに機能しました-ビルド中、.DLLは "\ lib"サブフォルダーなしで出力ディレクトリにコピーされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.