Visual Studioのビルドイベントでビルド後の処理を自動化してみる
こんにちは、 情熱開発部プログラム2課の樋宮です。
10月に入り、少しずつ秋らしい空気を感じるようになってきました。
過ごしやすい季節になってきた一方で、開発中はビルドのたびにDLLをコピーしたり、決まった処理を繰り返したり……そんなちょっとした手間が気になることもあります。
そんなビルド前後の作業を自動化できるのが、Visual Studioの「ビルドイベント」です。
ということで今回は、実際にビルドイベントを使いながら、基本的な使い方から内部でどのように処理されているのかまで見ていこうと思います。
※本ブログではVisual Studio 2026を使用しています
ビルドイベントってなに?
ビルドイベントとは
ビルドイベントとは、プロジェクトのビルド処理をきっかけに、あらかじめ指定しておいたコマンドを自動で実行する仕組みです。
例えば、
- ビルド前に必要なファイルを準備する
- ビルド後に生成されたDLLを別のフォルダへコピーする
- batファイルや外部ツールを実行する
といった処理を、ビルドのたびに手動で行わず自動化できます。
Visual Studioでは、主に以下の2つのタイミングでビルドイベントを設定できます。
- Pre-build event
- Post-build event
Pre-build event
ビルド処理が行われる前に実行されるイベントです。
ビルドに必要なファイルの準備などに利用できます。
Post-build event
ビルド処理が完了したあとに実行されるイベントです。
ビルドしたDLLのコピーや、設定ファイルの配置などに利用できます。
実際にビルドイベントを使ってみる
サンプルプロジェクトを作る
今回は、ビルドイベントの動作を確認するために簡単なC#クラスライブラリを作成します。
プロジェクト名は「BuildEventSample」とします。
今回コピー先に使用するDeployフォルダは、あらかじめ作成しておく必要があるため注意してください。
BuildEventSample/
├─ BuildEventSample.csproj
└─ Deploy/

DLLをPost-build Eventでコピーしてみる
まずは、ビルドされたファイルを別のフォルダへコピーしてみます。
ビルドイベントはプロジェクトのプロパティから設定可能です。
ビルド/イベントの項目からPost-build Eventに以下のようなコマンドを設定します。
ビルドイベントを見るのが目的なのでコード自体は特にいじりません。
copy "$(TargetPath)" "$(ProjectDir)Deploy"
ビルドを実行し、Deployフォルダへファイルがコピーされることを確認します。

正常に動作すれば上記のようなログが表示され、コピーされているのが確認できます。

Visual Studioのマクロ(MSBuildプロパティ)
ビルドイベントでは、$(TargetPath) や $(ProjectDir) などのMSBuildプロパティを利用できます。
代表的なものは以下になります。
| マクロ | 内容 |
|---|---|
| $(TargetPath) | ビルドされたファイルのフルパス |
| $(TargetDir) | ビルド成果物の出力先 |
| $(ProjectDir) | プロジェクトのあるディレクトリ |
| $(SolutionDir) | ソリューションのあるディレクトリ |
| $(Configuration) | Debug / Releaseなど |
copyコマンド
copyは先ほど使用したもので、ファイルをコピーするための基本的なコマンドです。
ビルドイベントでは、ビルドされたDLLや設定ファイルなどを別の場所へコピーするときに利用できます。
例:
copy "$(TargetPath)" "$(ProjectDir)Deploy"xcopyコマンド
フォルダ単位でファイルをコピーしたい場合は、xcopyを利用できます。
例:
xcopy "$(ProjectDir)SampleFiles" "$(ProjectDir)Deploy\SampleFiles\" /E /I /Y/E : 空のフォルダを含め、サブフォルダもコピーする
/I : コピー先が存在しない場合、ディレクトリとして扱う
/Y : 上書き時の確認を省略する
ifで条件分岐する
ビルド構成によって処理を切り替えることもできます。
例えば、Releaseビルドの場合だけコピーする場合は以下のように記述できます。
if "$(Configuration)"=="Release" (
copy "$(TargetPath)" "$(ProjectDir)Deploy"
)ビルドイベントを書くときの注意点
パスを含む引数は ” で囲う
ファイルパスやフォルダパスにスペースが含まれている場合、コマンドが意図しない位置で分割されてしまいます。そのため、パスを渡す場合は次のようにダブルクォーテーションで囲っておく方が安全です。
コマンドの終了コードに注意する
ビルドイベントで実行したコマンドが 0 以外の終了コードを返すと、ビルドイベントの失敗として扱われ、ビルド自体が失敗することがあります。
そのため、使用するコマンドや外部ツールがどのような終了コードを返すのか確認しておく必要があります。
特に xcopy のように複数の終了コードが定義されているコマンドを使用する場合は、注意が必要です。
コピー先の基準を明確にする
ビルド成果物のコピー先は、必ずしも $(TargetDir) や $(ProjectDir) の配下とは限りません。
例えば、別のアプリケーションのPluginsフォルダへDLLを配置する場合など、プロジェクトの外部へコピーするケースもあります。
その場合でも、
$(SolutionDir)
$(ProjectDir)
など、基準となるディレクトリを明示したうえでパスを組み立てておくと、どこへコピーしている処理なのか把握しやすくなります。
一方で、
..\..\..\Deploy\のように親ディレクトリを何段もたどる指定や、
C:\Users\○○\Desktop\Deploy\のような開発環境固有の絶対パスを直接記述してしまうと、環境ごとに動作が不安定になってしまうため注意が必要です。
設定したビルドイベントは実際どう動いている?
.csprojを見てみる
Visual Studioでビルドイベントを設定した状態で、プロジェクトの.csprojファイルを確認してみます。

ビルドイベントもMSBuildの処理になっている
.csprojを確認すると、Visual StudioのGUIから設定したビルドイベントもTargetとして記述されています。例えば、Post-build Eventの場合は以下のような形になります。

PreBuildEvent / PostBuildEventとTarget
MSBuildでは、ビルド処理が複数のTargetによって構成されています。
PreBuildEventやPostBuildEventも、そのビルド処理の中で利用されるTargetです。
例えば、
<Target Name="PostBuild" AfterTargets="PostBuildEvent">と記述されている場合、
- PostBuildというTargetを定義する
- PostBuildEventのあとに実行する
という意味になります。
Execを使わずに書き換えてみる
ここまで使用していたPost-build Eventを削除し、同じ処理をMSBuildのTargetとして直接記述してみます。
これまで使用していた処理:
copy "$(TargetPath)" "$(ProjectDir)Deploy"これを、例えば以下のように書き換えます。
<Target Name="CopyBuildResult" AfterTargets="PostBuildEvent">
<Copy
SourceFiles="$(TargetPath)"
DestinationFolder="$(ProjectDir)Deploy" />
</Target>このTargetでは、ビルド完了後に生成されたファイルをDeployフォルダへコピーしています。
- Name=”CopyBuildResult”
Targetの名前です。任意の名前を付けられます。 - AfterTargets=”PostBuildEvent”
Build Targetの実行後に、このTargetを実行するよう指定しています。 - <Copy>
MSBuildが用意しているファイルコピー用のTaskです。 - SourceFiles=”$(TargetPath)”
コピー元です。
$(TargetPath)には、ビルドによって生成された成果物のフルパスが入ります。 - DestinationFolder=”$(ProjectDir)Deploy”
コピー先です。
$(ProjectDir)を基準に、Deployフォルダを指定しています。
Post-build Eventでは copy コマンドをExec経由で実行していましたが、
こちらではMSBuild自身が用意しているCopy Taskを使って同じ処理を記述しています。
Visual StudioのPost-build Event欄が空の状態でも、同じようにファイルがコピーされることを確認します。



正しくコピーされていますね。
Post-build Eventでcopyコマンドを実行した場合とは異なり、
MSBuildのCopy Taskとして処理されるため、ビルド出力上での表示も異なります。
表示される内容はVisual Studioのビルド出力の詳細度によって変わります。

ビルドイベントとMSBuild Targetの違い
| ビルドイベント | MSBuild Target |
|---|---|
| GUIから簡単に設定できる | .csprojなどへ記述する |
| copyなどのコマンドを使いやすい | CopyなどのMSBuild Taskを使える |
| 単純な処理向き | 複雑な処理を構成しやすい |
| シェルコマンドに依存しやすい | シェルへの依存を減らせる |
まとめ
- ビルドイベントを使うことで、ビルド前後の処理を簡単に自動化できる
- DLLやファイルのコピーだけでなく、batファイルや外部ツールの実行にも利用できる
- Visual Studioで設定したビルドイベントも、内部ではMSBuildのTargetとして扱われている
- 処理が複雑になってきた場合は、MSBuild Targetとして記述する方法も選択肢になる
- ビルド処理の自動化を始める入口として、ビルドイベントは扱いやすい
毎回手作業で行っている処理がある場合は、ビルドイベントに置き換えられないか一度見直してみると、作業の手間や実行漏れを減らせます。
単純な処理であれば導入もしやすいため、ビルド後のファイル配置やbatファイルの実行など、身近なところからぜひ活用してみてくださいね。
参考
- ビルド イベントを指定する (C#)
https://learn.microsoft.com/ja-jp/visualstudio/ide/how-to-specify-build-events-csharp?view=visualstudio - Target要素
https://learn.microsoft.com/ja-jp/visualstudio/msbuild/target-element-msbuild?view=visualstudio - MSBuild ターゲット
https://learn.microsoft.com/ja-jp/visualstudio/msbuild/msbuild-targets?view=visualstudio - ターゲットのビルド順序
https://learn.microsoft.com/ja-jp/visualstudio/msbuild/target-build-order?view=visualstudio - Visual Studio のビルド プロセスを拡張する
https://learn.microsoft.com/ja-jp/visualstudio/msbuild/how-to-extend-the-visual-studio-build-process?view=visualstudio
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。