Visual StudioにDLLファイルを出力ディレクトリにコピーさせる方法は?


101

外部DLLファイルに依存するVisual Studio C ++プロジェクトがあります。プロジェクトをビルドするときに、Visual StudioでこのDLLファイルを出力ディレクトリ(デバッグ/リリース)に自動的にコピーするにはどうすればよいですか?

回答:


90

プロジェクトでビルド後のアクションを使用し、問題のあるDLLをコピーするコマンドを追加します。ビルド後のアクションは、バッチスクリプトとして記述されます。

出力ディレクトリはとして参照できます$(OutDir)。プロジェクトディレクトリはとして利用できます$(ProjDir)。ビルド後のアクションを中断せずにプロジェクトフォルダーをコピーまたは移動できるように、該当する場合は相対パスを使用してください。


25
彼がプロジェクト>プロパティ>ビルドイベント>ビルド後のイベントを介してビルド後のイベントを設定できることも指摘する価値があります。
Philブース


36
リンクが壊れた場合: "xcopy / y" $(ProjectDir)*。dll "" $(OutDir) "
ace

上記を、インスタンスでコマンドを個人的に使用する方法に変更しました。この意志; ソース管理に適した読み取り専用ファイルをコピーし、ターゲットディレクトリを作成します(通常は必要ありません)。-> xcopy "$(ProjectDir)*。dll" "$(OutDir)" / i / r / y
Joes

8
/ dフラグをxCopyに追加して、出力ディレクトリで変更されていないファイルの不要な再コピーを防止します。
Zoey 2014

43

$(OutDir)はVS2013では相対パスであることが判明したため、目的の効果を実現するために$(ProjectDir)と組み合わせる必要がありました。

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

ところで、最初に「echo」を追加してスクリプトを簡単にデバッグし、ビルド出力ウィンドウで拡張されたテキストを確認できます。


3
$(TargetDir)は$(ProjectDir)$(OutDir)を置き換えることができます。これは、両方の組み合わせであるためです。
person27 2017年

私の場合、/ dがないと、アクセス拒否エラーがスローされていました。ただし、ドキュメントによる/ dは日付に関するものです。接続が何かわからない。
ラビC

1
/ dを追加すると、ソースファイルが古い場合や既存のファイルと同じ場合に上書きが防止されます。ターゲットが別のプロセスによってロックされている場合、アクセス拒否エラーが発生する可能性があります。
Rich Shealer

7

上記のコメントセクションの詳細は、出力ソリューションを1つのC ++プロジェクトから同じソリューション内の別のC#プロジェクトのリリースおよびデバッグフォルダーにコピーしようとしたときに機能しませんでした(VS 2013)。

次のビルド後のアクション(.dll出力のあるプロジェクトを右クリック)を追加し、プロパティ->構成プロパティ->ビルドイベント->ビルド後のイベント->コマンドラインを追加する必要がありました。

ここで、次の2行を追加して、出力dllを2つのフォルダーにコピーします。

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

5

(この答えはC#にのみ適用され、C ++には適用されません。申し訳ありませんが、元の質問を誤解しています)

以前にこのようなDLL地獄を経験したことがあります。私の最後の解決策は、アンマネージDLLをマネージDLLにバイナリリソースとして保存し、プログラムの起動時に一時フォルダーに抽出し、破棄されたときに削除することでした。

これ .NETまたはpinvokeインフラストラクチャの一部である必要があります。これは非常に便利であるためです。マネージDLLをXcopyを使用して、またはより大きなVisual Studioソリューションのプロジェクト参照として、管理しやすくします。これを実行したら、ビルド後のイベントについて心配する必要はありません。

更新:

私はここに別の回答でコードを投稿しましたhttps://stackoverflow.com/a/11038376/364818


1
私は同意します、それはフレームワークの一部である必要があります(dllを静的にリンクするなど)-注目に値し、リソースとしてdllを格納し、実行時にそれを抽出すると、一部の企業環境で問題が発生する可能性があります(特に、プロアクティブなウイルス対策ソフトウェア)。
BrainSlugs83

1

project.csprojファイルに組み込みのCOPYを追加します。

  <Project>
    ...
    <Target Name="AfterBuild">
      <Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Debug\bin" SkipUnchangedFiles="false" />
      <Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Release\bin" SkipUnchangedFiles="false" />
    </Target>
  </Project>

VSには長期的なバグがあります。SolutionDirではなくProjectDirを使用してください
John_J

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

相対パスを参照することもできます。次の例では、プロジェクトフォルダーの1つ上のレベルにあるフォルダーでDLLを検索します。単一のソリューションでDLLを使用する複数のプロジェクトがある場合、スタートアッププロジェクトとしてそれらを設定すると、DLLのソースが到達可能な共通領域に配置されます。

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

/y確認せずにオプションをコピーします。この/dオプションは、ファイルがターゲットに存在するかどうか、およびソースにターゲットよりも新しいタイムスタンプがある場合にのみコピーされるかどうかを確認します。

VS2109などのVisual Studioの少なくとも新しいバージョンで$(ProjDir)は定義されておらず、$(ProjectDir)代わりに使用する必要があることがわかりました。

ターゲットフォルダーを除外すると、xcopyデフォルトで出力ディレクトリになります。理由$(OutDir)だけを理解することは重要ではありません。

$(OutDir)、少なくとも最近のバージョンのVisual Studioでは、などの出力フォルダーへの相対パスとして定義されますbin/x86/Debug。それをターゲットとして単独で使用すると、プロジェクト出力フォルダーから始まる新しいフォルダーのセットが作成されます。例:… bin/x86/Debug/bin/x86/Debug

それをプロジェクトフォルダと組み合わせると、適切な場所に移動するはずです。例:$(ProjectDir)$(OutDir)

ただし$(TargetDir)、1つのステップで出力ディレクトリを提供します。

Microsoftの現在および以前のバージョンのVisual Studio用のMSBuildマクロのリスト

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