C#のPJから使うC++(アンマネージド)のDLLのPJが勝手にコピーされてくれないのでビルド後イベントでコピーする

もくじ
https://tera1707.com/entry/2022/02/06/144447

やりたいこと

C#のプロジェクトからC++で作ったDLLを使うときに、ビルドしただけでは自動でコピーされてくれない。 (C#のexeの出力先に、C++のDLLがコピーされてくれないので、ビルドしただけではデバッグできるようにならない)

C#のプロジェクトからC#のDLLを使うときは、使う側のPJの参照設定にC#のDLLのプロジェクトを参照に入れておくだけで、出力先に一緒にコピーされてくれるが、C++のDLLだとそういうわけにはいかない。

そういうときに、ビルド後イベントで、C++のDLLの出力ファイル一式を、使う側のC#のPJの出力先にコピーするようにすると便利だったのでやり方をメモする。

前提

下記のようなソリューション、プロジェクトとその出力物の構成だとする。

図のように、C++DLLをビルドして出来上がったものを、C#の各使う側PJの出力先にコピーしたい。

やったこと

.NET6のPJと.NETFW4.8のPJで試したのだが、微妙に使えるスクリプトが異なったので分けてメモする。

.NET6のC#プロジェクトからC++のDLLを使う場合

下記のスクリプトを、ビルド後イベントに入れた。

xcopy /Y /S /I "$(SolutionDir)$(PlatformName)\$(Configuration)\" "$(ProjectDir)$(OutDir)"

こんな感じ。

.NET6では、下記のスクリプトでも使えた。
(.NET6だと、相対パスが使える??)

xcopy /y /s /d "..\$(PlatformName)\$(Configuration)\" "$(OutDir)"

.NET Framework4.8のC#プロジェクトからC++のDLLを使う場合

下記のスクリプトを、ビルド後イベントに入れた。※.NET6の1個目と同じ。

xcopy /Y /S /I "$(SolutionDir)$(PlatformName)\$(Configuration)\" "$(ProjectDir)$(OutDir)"

※.NET6で使えた相対パスの方は、FW4.8だとうまく動かなかった。.NETFW48だと相対パスが使えない?

参考

ビルド後イベントで使えるマクロの一覧

https://learn.microsoft.com/ja-jp/visualstudio/ide/reference/pre-build-event-post-build-event-command-line-dialog-box?view=vs-2022