web-dev-qa-db-ja.com

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

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

93
Mat

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

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

87
Adrien Plisson

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

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

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

37
Nesho Neshev

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

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

出力DLLを2つのフォルダーにコピーするために、次の2行を追加しました。

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

(この回答はC#ではなくC#にのみ適用されます。元の質問を読み間違えました)

私は以前DLLこのような地獄を通り抜けました。最終的な解決策は、マネージドDLLバイナリリソースとしてアンマネージDLLを保存し、プログラムの起動時に一時フォルダーを作成し、破棄されたら削除します。

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

更新:

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

4
Mark Lakata
_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)だけでは役に立たないことを理解するために重要です。

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

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

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

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

0
Rich Shealer