Skip to content

MS_MSBuild

nishi_74322014 edited this page Aug 21, 2026 · 1 revision

MSBuild

概要

補足(.csproj は MSBuild のスクリプトである): 最も重要な事実は、
プロジェクト ファイル(.csproj / .vbproj)そのものが
MSBuild の XML スクリプト
だということである。

Visual Studio ─┐
                ├──▶ MSBuild ──▶ csc(Roslyn)──▶ アセンブリ
dotnet build ──┤            ↑
CI(GitHub等)─┘        .csproj を解釈

したがって「Visual Studio ではビルドできるが CI では落ちる」といった
問題は、同じ MSBuild を使っている以上、環境差(SDK、ワークロード、
NuGet の構成)に原因がある
と切り分けられる。

構成要素は 4 つ。

要素 意味
プロパティ (<PropertyGroup>) 変数($(Configuration) など)
アイテム (<ItemGroup>) ファイルの集合(@(Compile) など)
タスク 1 つの処理(CscCopyExec
ターゲット (<Target>) タスクをまとめた単位(BuildClean

詳細

タスク

  • タスクを利用すると種々の作業を自動化できる。
  • プロジェクトファイルの <Target> 要素にタスクを記載する。

標準タスク

Community タスク

補足(ビルド前後に処理を挟む): 実務で最もよく使うのは、
既定のターゲットの前後にフックする書き方である。

<Target Name="MyAfterBuild" AfterTargets="Build">
  <Copy SourceFiles="@(Content)" DestinationFolder="$(OutDir)assets" />
  <Exec Command="npm run build" WorkingDirectory="ClientApp" />
</Target>

BeforeTargets / AfterTargets を使うと、
既定のターゲットを上書きせずに処理を追加できる
(古い BeforeBuild / AfterBuild のオーバーライドより安全)。

メモ

MSBuild 14.0

MSBuild 15.0

  • Visual Studio 2017 では MSBuild 15.0 がインストール&利用される。

    • C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
    • C:\Program Files (x86)\MSBuild\15.0
  • NuGet のバージョンは、MSBuild 14.0 では 3.5 までとなっており、
    MSBuild 15.0 では 4.0 以上が必要。

    • 以下の文字列を使用して検索すると情報が見つかる。
Failed to load msbuild Toolset Could not load file or assembly 'Microsoft.Build, Version=14.0.0.0

補足(MSBuild の在り処が変わった): MSBuild 15.0(VS2017)以降、
MSBuild は Visual Studio に同梱されるようになり、
C:\Windows\Microsoft.NET\Framework\ の下から
Visual Studio のインストール先へ移動した。

【〜14.0】C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe
【15.0〜】C:\Program Files\Microsoft Visual Studio\2022\<エディション>\MSBuild\Current\Bin\MSBuild.exe

このため **CI サーバで「MSBuild が見つからない」**という問題が起きた。
現在の対処は次のいずれか。

手段 用途
dotnet build .NET SDK 形式のプロジェクト(最も簡単。VS 不要)
vswhere.exe VS のインストール先を検出して MSBuild のパスを得る
Build Tools for Visual Studio CI 用のIDE を含まないビルド専用インストール

.NET Core 系なら dotnet build で完結するため、
この問題自体が発生しない。

Visual Studio との差異

Visual Studio は製品だけあって、
MSBuild では自分で頑張らないといけないことも多い。

コンパイラのバージョン

NuGet リストアの実行

ビルドに必要なコンポーネントの自前構成

補足(この差が CI 構築の勘所): Visual Studio が
暗黙にやってくれていることを、MSBuild 単体では明示する必要がある。

項目 Visual Studio MSBuild 単体
NuGet の復元 自動 msbuild /t:Restore または nuget restore が要る
コンパイラ VS 同梱の Roslyn ツールセットの指定が要る場合がある
Web/Azure などのターゲット VS のワークロードが提供 .targets が無くて失敗(後述の MSB4019)

dotnet build はこれらを暗黙に処理する(復元も自動)ため、
CI の構築難度が大きく下がった。
dotnetコマンド を参照。

トラブルシュート

devenv でのビルドと比べ、チラホラと、エラーが起きる。

NuGet 使用時(NuGet

ビルド時

補足("mark of the web" について): インターネットから
ダウンロードしたファイルには Zone.Identifier という代替データ ストリーム
付与され、.NET がそれをブロックする。

対処は、

  • エクスプローラーのプロパティで**[許可する]にチェック**、
  • PowerShell で Unblock-File を再帰実行、
Get-ChildItem -Recurse | Unblock-File

ZIP を展開する前に ZIP 自体をブロック解除しておくと、
展開後のファイルに付かない。

参考

Microsoft Learn


Tags: 移行, .NET開発, テスト, デバッグ, デプロイ, ツール類, CI

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally