概要
.NET 11 は2026年11月ごろの正式リリースが予定されています。プレビューも後半戦に入ってきましたので、これまでの Preview で追加された機能をトピックごとに振り返っています。
本記事では MSBuild に関する Preview 5 の変更点をまとめます。Preview 5 では、以前のプレビューから続くマルチスレッド実行・ログ出力・評価パフォーマンスの改善が中心となっています。主なトピックは以下の通りです。
- 環境変数からマルチスレッドビルドを有効化できるようになった
- 評価とアイテムのフィルタリングが高速化された
- バイナリログの再生が古いログにも対応した
- MSBuild が Haiku 上で動作するようになった
本記事は .NET 11 Preview 5 の公式リリースノートを元に整理しています。プレビュー段階の内容のため、正式リリースまでに変わる可能性がある点にはご注意ください。
環境変数からマルチスレッドビルドを有効化できるようになった
MSBuild では以前から -multiThreaded / -mt というコマンドラインスイッチでマルチスレッドビルドを有効化できましたが、Preview 5 ではこれと同等の環境変数 MSBUILDFORCEMULTITHREADED=1 がサポートされました。
set MSBUILDFORCEMULTITHREADED=1
dotnet build MySolution.sln
これにより、コマンドラインスイッチを簡単に追加できない CI システムや IDE、ラッパースクリプトからでも、マルチスレッドビルドを有効化しやすくなっています。
また Preview 5 では、より多くの組み込みタスクがマルチスレッド実行モデルに移行しました。ResolveAssemblyReference や GetAssemblyIdentity、各種マニフェスト系タスクなどが、プロセス全体のカレントディレクトリに依存せず、タスク環境からプロジェクト相対パスを扱うようになっています。
なお、現時点のマルチスレッドビルドはマルチプロセスビルドと同じ成果物を生成する互換性はあるものの、タスク分離のためのプロセス間通信のオーバーヘッドにより、まだマルチプロセスビルドよりは遅い想定とのことです。今後タスクの対応が進むにつれて、この差は縮まっていく見込みです。
評価とアイテムのフィルタリングが高速化された
評価処理で多用されるエスケープ用ヘルパー(EscapingUtilities.Escape / UnescapeAll)のアロケーションと実行速度が改善されました。公式のベンチマークでは、特殊文字を含まないケースのエスケープが 17.96 ns → 5.37 ns に、無効なエスケープシーケンスの解除では 48 B のアロケーションが 0 B になるなど、地味ながら効いてくる改善が入っています。
加えて、大量のアイテムに対してバッチで削除を行うケースのフィルタリングが、線形時間の挙動に戻りました。数万件のアイテムを持つ C++ プロジェクトのビルドで Lookup.GetItems に何時間もかかるという回帰があったのですが、これが O((N + A) x M) から O(N + A + M) に戻されています。
バイナリログの再生が古いログにも対応した
コマンドラインでのバイナリログ(.binlog)の再生が、ツールのバージョンよりログのバージョンが古い場合でも再生できるようになりました。以前はバージョンが低いと完全に拒否されていましたが、Preview 5 では理解できないエントリはスキップし、再生後にバージョン警告を出すという挙動になっています。
dotnet msbuild -bl:build.binlog MyProject.csproj
dotnet msbuild build.binlog
これにより、古い環境で採取した .binlog でも、互換性のあるイベントについては引き続き参照できるようになりました。
MSBuild が Haiku 上で動作するようになった
MSBuild が Haiku を Unix ライクな OS として認識するようになりました。これにより Haiku 上でも Linux や macOS と同じ共有 Unix パスが選択され、.cmd ではなく .sh スクリプトを呼び出すようになります。コミュニティコントリビューター(@trungnt2910 さん)による貢献とのことです。
そのほかのバグ修正
Preview 5 ではこのほかにも、以下のようなバグ修正が入っています。
-
BuildManager.ShutdownAllNodes()が AppHost 起動のワーカーノードを見つけられるようになり、dotnet build-server shutdownでMSBuild.exeノードを片付けられるようになった - Windows でワーカープロセス識別時に WMI を使わなくなり、
dotnetプロセスが多いマシンでのレイテンシを削減 - Terminal Logger が消費しないタスク入力ログを無効化し、大きなタスクパラメーターのシリアライズを回避
-
WriteLinesToFileやCopyタスクの並列書き込み・非 Windows 環境まわりの挙動改善
まとめ
- 環境変数
MSBUILDFORCEMULTITHREADED=1でマルチスレッドビルドを有効化できるようになり、CI や IDE から使いやすくなった - 評価・フィルタリング処理の高速化や、古いバイナリログの再生対応など、日々のビルド体験に効いてくる改善が入っている
- Haiku サポートの追加など、コミュニティ貢献による対応も進んでいる
MSBuild は普段あまり意識しない部分ですが、マルチスレッド化の流れは正式リリースに向けて要注目だと思います。
この記事が皆様のコーディングライフの助けになれば幸いです。
参考