回答:
プロジェクトでビルド後のアクションを使用し、問題のあるDLLをコピーするコマンドを追加します。ビルド後のアクションは、バッチスクリプトとして記述されます。
出力ディレクトリはとして参照できます$(OutDir)
。プロジェクトディレクトリはとして利用できます$(ProjDir)
。ビルド後のアクションを中断せずにプロジェクトフォルダーをコピーまたは移動できるように、該当する場合は相対パスを使用してください。
$(OutDir)はVS2013では相対パスであることが判明したため、目的の効果を実現するために$(ProjectDir)と組み合わせる必要がありました。
xcopy /y /d "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"
ところで、最初に「echo」を追加してスクリプトを簡単にデバッグし、ビルド出力ウィンドウで拡張されたテキストを確認できます。
上記のコメントセクションの詳細は、出力ソリューションを1つのC ++プロジェクトから同じソリューション内の別のC#プロジェクトのリリースおよびデバッグフォルダーにコピーしようとしたときに機能しませんでした(VS 2013)。
次のビルド後のアクション(.dll出力のあるプロジェクトを右クリック)を追加し、プロパティ->構成プロパティ->ビルドイベント->ビルド後のイベント->コマンドラインを追加する必要がありました。
ここで、次の2行を追加して、出力dllを2つのフォルダーにコピーします。
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug
(この答えはC#にのみ適用され、C ++には適用されません。申し訳ありませんが、元の質問を誤解しています)
以前にこのようなDLL地獄を経験したことがあります。私の最後の解決策は、アンマネージDLLをマネージDLLにバイナリリソースとして保存し、プログラムの起動時に一時フォルダーに抽出し、破棄されたときに削除することでした。
これは .NETまたはpinvokeインフラストラクチャの一部である必要があります。これは非常に便利であるためです。マネージDLLをXcopyを使用して、またはより大きなVisual Studioソリューションのプロジェクト参照として、管理しやすくします。これを実行したら、ビルド後のイベントについて心配する必要はありません。
更新:
私はここに別の回答でコードを投稿しましたhttps://stackoverflow.com/a/11038376/364818
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>
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つのステップで出力ディレクトリを提供します。