ぷるぷるの雑記

低レイヤーがんばるぞいなブログ. 記事のご利用は自己責任で.

MSBuildとは

Visual Studioをインストールしたり、個別にBuild Tools for Visual StudioをインストールするとMSBuildがインストールされます. リファレンスでは以下のように説明されています.

Microsoft Build Engine は、アプリケーションをビルドするためのプラットフォームです。 MSBuild とも呼ばれるこのエンジンには、ビルド プラットフォームでソフトウェアを処理およびビルドする方法を制御する、プロジェクト ファイル用の XML スキーマが用意されています。 Visual StudioMSBuild を使用しますが、MSBuildVisual Studio に依存しません。 プロジェクト ファイルまたはソリューション ファイルに対して msbuild.exe または dotnet build を実行すると、Visual Studio がインストールされていない環境で、製品の統合とビルドを実行できます。

つまり、Windows用のアプリケーションのビルドにはVisual Studioは必須ではありません. コマンドラインからMSBuildでを利用することでもプロジェクトをビルドすることが出来ます.

分かりやすく例えるとMSBuildはmakeコマンドのようなものです. Visual Studioによって生成されるソリューションファイルやプロジェクトファイルがmakefileの代わりになります.

以下、次の環境で検証しました.

項目 説明
OS Windows11
Visual Studio 2017

VC++プロジェクトをコマンドラインからMSBuild

Visual Studioで新規のVC++プロジェクトを作成します. プロジェクトはなんでもよいのですがなんとなくMFCアプリケーションを以下の通りに作成しました.

項目 説明
ソリューション名 MFCApplication
プロジェクト名 Application
プロジェクトの種類 VC++ MFCアプリケーション

VC++プロジェクトを作成後、カレントディレクトリをMSBuildにしソリューションファイルをオプションに指定してMSBuild.exeを実行しましょう. どうやら、Visual Studio 上でビルドしたときのような挙動になります.

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin>msbuild C:\Users\xxx\source\repos\MFCApplication\MFCApplication.sln
.NET Framework 向け Microsoft (R) Build Engine バージョン 15.9.21+g9802d43bc3
Copyright (C) Microsoft Corporation.All rights reserved.

このソリューション内のプロジェクトを 1 度に 1 つずつビルドします。並行ビルドを有効にするには、"/m" スイッチを追加してく ださい。
2023/05/08 23:05:53 にビルドを開始しました。
ノード 1 上のプロジェクト "C:\Users\xxx\source\repos\MFCApplication\MFCApplication.sln" (既定のターゲット)。
ValidateSolutionConfiguration:
  ソリューション構成 "Debug|x64" をビルドしています。
プロジェクト "C:\Users\xxx\source\repos\MFCApplication\MFCApplication.sln" (1) は、ノード 1 上に "C:\Users\xxx\source\repos\MFCA
pplication\Application\Application.vcxproj" (2) をビルドしています (既定のターゲット)。
PrepareForBuild:
  ディレクトリ "x64\Debug\" を作成しています。
  ディレクトリ "C:\Users\xxx\source\repos\MFCApplication\x64\Debug\" を作成しています。
  ディレクトリ "x64\Debug\Application.tlog\" を作成しています。
InitializeBuildStatus:
  "AlwaysCreate" が指定されたため "x64\Debug\Application.tlog\unsuccessfulbuild" を作成しています。
ClCompile:
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\CL.exe /c /ZI
   /JMC /nologo /W3 /WX- /diagnostics:classic /sdl /Od /D _WINDOWS /D _DEBUG /D _UNICODE /D UNICODE /D _AFXDLL /Gm- /EH
  sc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Yc"pch.h" /Fp"x64\Debug\Application.pch" /Fo"x64\D
  ebug\\" /Fd"x64\Debug\vc141.pdb" /Gd /TP /FC /errorReport:queue pch.cpp
  pch.cpp
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\CL.exe /c /ZI
   /JMC /nologo /W3 /WX- /diagnostics:classic /sdl /Od /D _WINDOWS /D _DEBUG /D _UNICODE /D UNICODE /D _AFXDLL /Gm- /EH
  sc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Yu"pch.h" /Fp"x64\Debug\Application.pch" /Fo"x64\D
  ebug\\" /Fd"x64\Debug\vc141.pdb" /Gd /TP /FC /errorReport:queue Application.cpp ApplicationDoc.cpp ApplicationView.cp
  p ChildFrm.cpp ClassView.cpp FileView.cpp MainFrm.cpp OutputWnd.cpp PropertiesWnd.cpp ViewTree.cpp
  Application.cpp
  ApplicationDoc.cpp
  ApplicationView.cpp
  ChildFrm.cpp
  ClassView.cpp
  FileView.cpp
  MainFrm.cpp
  OutputWnd.cpp
  PropertiesWnd.cpp
  ViewTree.cpp
  コードを生成中...
ResourceCompile:
  C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x86\rc.exe /D _DEBUG /D _UNICODE /D UNICODE /D _AFXDLL /l"0x0
  411" /Ix64\Debug\ /nologo /fo"x64\Debug\Application.res" Application.rc
Link:
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\link.exe /ERR
  ORREPORT:QUEUE /OUT:"C:\Users\xxx\source\repos\MFCApplication\x64\Debug\Application.exe" /INCREMENTAL /NOLOGO /MANI
  FEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /manifestinput:"C:\Program Files (x86)\Microso
  ft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\Include\Manifest\dpiaware.manifest" /DEBUG:FASTLINK /PDB:"C
  :\Users\xxx\source\repos\MFCApplication\x64\Debug\Application.pdb" /SUBSYSTEM:WINDOWS /TLBID:1 /ENTRY:"wWinMainCRTS
  tartup" /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:\Users\xxx\source\repos\MFCApplication\x64\Debug\Application.lib" /MACHIN
  E:X64 x64\Debug\Application.res
  x64\Debug\Application.obj
  x64\Debug\ApplicationDoc.obj
  x64\Debug\ApplicationView.obj
  x64\Debug\ChildFrm.obj
  x64\Debug\ClassView.obj
  x64\Debug\FileView.obj
  x64\Debug\MainFrm.obj
  x64\Debug\OutputWnd.obj
  x64\Debug\pch.obj
  x64\Debug\PropertiesWnd.obj
  x64\Debug\ViewTree.obj
  Application.vcxproj -> C:\Users\xxx\source\repos\MFCApplication\x64\Debug\Application.exe
FinalizeBuildStatus:
  ファイル "x64\Debug\Application.tlog\unsuccessfulbuild" を削除しています。
  "x64\Debug\Application.tlog\Application.lastbuildstate" のタッチ タスクを実行しています。
プロジェクト "C:\Users\xxx\source\repos\MFCApplication\Application\Application.vcxproj" (既定のターゲット) のビルドが 完了しました。

プロジェクト "C:\Users\xxx\source\repos\MFCApplication\MFCApplication.sln" (既定のターゲット) のビルドが完了しました。


ビルドに成功しました。
    0 個の警告
    0 エラー

経過時間 00:00:02.67

ソリューションではなくプロジェクト単位でビルドしたい場合はプロジェクトファイルを指定します.

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin>msbuild C:\Users\xxx\source\repos\MFCApplication\Application\Application.vcxproj
.NET Framework 向け Microsoft (R) Build Engine バージョン 15.9.21+g9802d43bc3
Copyright (C) Microsoft Corporation.All rights reserved.

2023/05/08 23:14:09 にビルドを開始しました。
ノード 1 上のプロジェクト "C:\Users\xxx\source\repos\MFCApplication\Application\Application.vcxproj" (既定のターゲット)。
PrepareForBuild:
  ディレクトリ "Debug\" を作成しています。
  ディレクトリ "Debug\Application.tlog\" を作成しています。
InitializeBuildStatus:
  "AlwaysCreate" が指定されたため "Debug\Application.tlog\unsuccessfulbuild" を作成しています。
ClCompile:
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x86\CL.exe /c /ZI /JMC /nologo /W3 /WX- /diagnostics:classic /sdl /Od /Oy- /D WIN32 /D _WINDOWS /D _DEBUG /D _UNICODE /D UNICODE /D _AFXDLL /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Yc"pch.h" /Fp"Debug\Application.pch" /Fo"Debug\\" /Fd"Debug\vc141.pdb" /Gd /TP /analyze- /FC /errorReport:queue pch.cpp
  pch.cpp
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x86\CL.exe /c /ZI
   /JMC /nologo /W3 /WX- /diagnostics:classic /sdl /Od /Oy- /D WIN32 /D _WINDOWS /D _DEBUG /D _UNICODE /D UNICODE /D _A
  FXDLL /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /Yu"pch.h" /Fp"Debug\Application.pch"
   /Fo"Debug\\" /Fd"Debug\vc141.pdb" /Gd /TP /analyze- /FC /errorReport:queue Application.cpp ApplicationDoc.cpp Applic
  ationView.cpp ChildFrm.cpp ClassView.cpp FileView.cpp MainFrm.cpp OutputWnd.cpp PropertiesWnd.cpp ViewTree.cpp
  Application.cpp
  ApplicationDoc.cpp
  ApplicationView.cpp
  ChildFrm.cpp
  ClassView.cpp
  FileView.cpp
  MainFrm.cpp
  OutputWnd.cpp
  PropertiesWnd.cpp
  ViewTree.cpp
  コードを生成中...
ResourceCompile:
  C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x86\rc.exe /D _DEBUG /D _UNICODE /D UNICODE /D _AFXDLL /l"0x0
  411" /IDebug\ /nologo /fo"Debug\Application.res" Application.rc
Link:
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x86\link.exe /ERR
  ORREPORT:QUEUE /OUT:"C:\Users\xxx\source\repos\MFCApplication\Application\Debug\Application.exe" /INCREMENTAL /NOLO
  GO /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /manifestinput:"C:\Program Files (x86)
  \Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\Include\Manifest\dpiaware.manifest" /DEBUG:FASTLINK
   /PDB:"C:\Users\xxx\source\repos\MFCApplication\Application\Debug\Application.pdb" /SUBSYSTEM:WINDOWS /TLBID:1 /ENT
  RY:"wWinMainCRTStartup" /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:\Users\xxx\source\repos\MFCApplication\Application\Debug\
  Application.lib" /MACHINE:X86 Debug\Application.res
  Debug\Application.obj
  Debug\ApplicationDoc.obj
  Debug\ApplicationView.obj
  Debug\ChildFrm.obj
  Debug\ClassView.obj
  Debug\FileView.obj
  Debug\MainFrm.obj
  Debug\OutputWnd.obj
  Debug\pch.obj
  Debug\PropertiesWnd.obj
  Debug\ViewTree.obj
  Application.vcxproj -> C:\Users\xxx\source\repos\MFCApplication\Application\Debug\Application.exe
FinalizeBuildStatus:
  ファイル "Debug\Application.tlog\unsuccessfulbuild" を削除しています。
  "Debug\Application.tlog\Application.lastbuildstate" のタッチ タスクを実行しています。
プロジェクト "C:\Users\xxx\source\repos\MFCApplication\Application\Application.vcxproj" (既定のターゲット) のビルドが 完了しました。


ビルドに成功しました。
    0 個の警告
    0 エラー

経過時間 00:00:02.48

.NET FrameworkプロジェクトをコマンドラインからMSBuild

Visual Studioで新規のC#プロジェクトを作成します. プロジェクトはなんでもよいのですがなんとなくWindowsフォームアプリケーションを以下の通りに作成しました.

項目 説明
ソリューション名 WindowsForms
プロジェクト名 WindowsFormsApp
プロジェクトの種類 Windows フォームアプリケーション(.NET Framework)
.NET Framework 4.6.1

先ほどと同様にソリューションをMSBuildすると以下のようになりました

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin>MSBuild C:\Users\xxx\source\repos\WindowsFormsApp\WindowsFormsApp.sln
.NET Framework 向け Microsoft (R) Build Engine バージョン 15.9.21+g9802d43bc3
Copyright (C) Microsoft Corporation.All rights reserved.

このソリューション内のプロジェクトを 1 度に 1 つずつビルドします。並行ビルドを有効にするには、"/m" スイッチを追加してく
ださい。
2023/05/16 23:27:52 にビルドを開始しました。
ノード 1 上のプロジェクト "C:\Users\xxx\source\repos\WindowsFormsApp\WindowsFormsApp.sln" (既定のターゲット)。
ValidateSolutionConfiguration:
  ソリューション構成 "Debug|Any CPU" をビルドしています。
プロジェクト "C:\Users\xxx\source\repos\WindowsFormsApp\WindowsFormsApp.sln" (1) は、ノード 1 上に "C:\Users\xxx\source\repos\Wi
ndowsFormsApp\WindowsFormsApp\WindowsFormsApp.csproj" (2) をビルドしています (既定のターゲット)。
GenerateBindingRedirects:
  ResolveAssemblyReferences から推奨されるバインド リダイレクトがありません。
CoreResGen:
  "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\resgen.exe" /useSourcePath /r:"C:\Program
   Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\Microsoft.CSharp.dll" /r:"C:\Program Files
   (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\mscorlib.dll" /r:"C:\Program Files (x86)\Referen
  ce Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Core.dll" /r:"C:\Program Files (x86)\Reference Assembli
  es\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.DataSetExtensions.dll" /r:"C:\Program Files (x86)\Reference A
  ssemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.dll" /r:"C:\Program Files (x86)\Reference Assemblies\M
  icrosoft\Framework\.NETFramework\v4.6.1\System.Deployment.dll" /r:"C:\Program Files (x86)\Reference Assemblies\Micros
  oft\Framework\.NETFramework\v4.6.1\System.dll" /r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.N
  ETFramework\v4.6.1\System.Drawing.dll" /r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramew
  ork\v4.6.1\System.Net.Http.dll" /r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.
  6.1\System.Windows.Forms.dll" /r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.
  1\System.Xml.dll" /r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Xml
  .Linq.dll" /compile Properties\Resources.resx,obj\Debug\WindowsFormsApp.Properties.Resources.resources
  リソース ファイル "Properties\Resources.resx" を "obj\Debug\WindowsFormsApp.Properties.Resources.resources" に処理しています。
GenerateTargetFrameworkMonikerAttribute:
すべての出力ファイルが入力ファイルに対して最新なので、ターゲット "GenerateTargetFrameworkMonikerAttribute" を省略します 。
CoreCompile:
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn\csc.exe /noconfig /nowarn:1701,
  1702 /nostdlib+ /platform:anycpu32bitpreferred /errorreport:prompt /warn:4 /define:DEBUG;TRACE /highentropyva+ /refer
  ence:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\Microsoft.CSharp.dll" /ref
  erence:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\mscorlib.dll" /reference
  :"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Core.dll" /reference:"C
  :\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.DataSetExtensions.dll
  " /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.dll" /
  reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Deployment.dll
  " /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.dll" /refer
  ence:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Drawing.dll" /refer
  ence:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll" /refe
  rence:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Windows.Forms.dll"
   /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Xml.dll" /re
  ference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Xml.Linq.dll" /d
  ebug+ /debug:full /filealign:512 /optimize- /out:obj\Debug\WindowsFormsApp.exe /ruleset:"C:\Program Files (x86)\Micro
  soft Visual Studio\2017\Community\Team Tools\Static Analysis Tools\\Rule Sets\MinimumRecommendedRules.ruleset" /subsy
  stemversion:6.00 /resource:obj\Debug\WindowsFormsApp.Properties.Resources.resources /target:winexe /utf8output /deter
  ministic+ Form1.cs Form1.Designer.cs Program.cs Properties\AssemblyInfo.cs Properties\Resources.Designer.cs Propertie
  s\Settings.Designer.cs "C:\Users\xxx\AppData\Local\Temp\.NETFramework,Version=v4.6.1.AssemblyAttributes.cs"
  次のディレクトリからのコンパイラでの共有コンパイルを使用しています: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Ros
  lyn
_CopyAppConfigFile:
  "App.config" から "bin\Debug\WindowsFormsApp.exe.config" へファイルをコピーしています。
CopyFilesToOutputDirectory:
  "obj\Debug\WindowsFormsApp.exe" から "bin\Debug\WindowsFormsApp.exe" へファイルをコピーしています。
  WindowsFormsApp -> C:\Users\xxx\source\repos\WindowsFormsApp\WindowsFormsApp\bin\Debug\WindowsFormsApp.exe
  "obj\Debug\WindowsFormsApp.pdb" から "bin\Debug\WindowsFormsApp.pdb" へファイルをコピーしています。
プロジェクト "C:\Users\xxx\source\repos\WindowsFormsApp\WindowsFormsApp\WindowsFormsApp.csproj" (既定のターゲット) の ビルドが完了しました。

プロジェクト "C:\Users\xxx\source\repos\WindowsFormsApp\WindowsFormsApp.sln" (既定のターゲット) のビルドが完了しました。


ビルドに成功しました。
    0 個の警告
    0 エラー

経過時間 00:00:00.53

プロジェクトをMSBuilsした場合は次のようになります

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin>MSBuild C:\Users\xxx\source\repos\WindowsFormsApp\WindowsFormsApp\WindowsFormsApp.csproj
.NET Framework 向け Microsoft (R) Build Engine バージョン 15.9.21+g9802d43bc3
Copyright (C) Microsoft Corporation.All rights reserved.

2023/05/16 23:29:39 にビルドを開始しました。
ノード 1 上のプロジェクト "C:\Users\xxx\source\repos\WindowsFormsApp\WindowsFormsApp\WindowsFormsApp.csproj" (既定のターゲット)。
GenerateBindingRedirects:
  ResolveAssemblyReferences から推奨されるバインド リダイレクトがありません。
CoreResGen:
  "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\resgen.exe" /useSourcePath /r:"C:\Program
   Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\Microsoft.CSharp.dll" /r:"C:\Program Files
   (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\mscorlib.dll" /r:"C:\Program Files (x86)\Referen
  ce Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Core.dll" /r:"C:\Program Files (x86)\Reference Assembli
  es\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.DataSetExtensions.dll" /r:"C:\Program Files (x86)\Reference A
  ssemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.dll" /r:"C:\Program Files (x86)\Reference Assemblies\M
  icrosoft\Framework\.NETFramework\v4.6.1\System.Deployment.dll" /r:"C:\Program Files (x86)\Reference Assemblies\Micros
  oft\Framework\.NETFramework\v4.6.1\System.dll" /r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.N
  ETFramework\v4.6.1\System.Drawing.dll" /r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramew
  ork\v4.6.1\System.Net.Http.dll" /r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.
  6.1\System.Windows.Forms.dll" /r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.
  1\System.Xml.dll" /r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Xml
  .Linq.dll" /compile Properties\Resources.resx,obj\Debug\WindowsFormsApp.Properties.Resources.resources
  リソース ファイル "Properties\Resources.resx" を "obj\Debug\WindowsFormsApp.Properties.Resources.resources" に処理しています。
GenerateTargetFrameworkMonikerAttribute:
すべての出力ファイルが入力ファイルに対して最新なので、ターゲット "GenerateTargetFrameworkMonikerAttribute" を省略します 。
CoreCompile:
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn\csc.exe /noconfig /nowarn:1701,
  1702 /nostdlib+ /platform:anycpu32bitpreferred /errorreport:prompt /warn:4 /define:DEBUG;TRACE /highentropyva+ /refer
  ence:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\Microsoft.CSharp.dll" /ref
  erence:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\mscorlib.dll" /reference
  :"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Core.dll" /reference:"C
  :\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.DataSetExtensions.dll
  " /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.dll" /
  reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Deployment.dll
  " /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.dll" /refer
  ence:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Drawing.dll" /refer
  ence:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll" /refe
  rence:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Windows.Forms.dll"
   /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Xml.dll" /re
  ference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Xml.Linq.dll" /d
  ebug+ /debug:full /filealign:512 /optimize- /out:obj\Debug\WindowsFormsApp.exe /ruleset:"C:\Program Files (x86)\Micro
  soft Visual Studio\2017\Community\Team Tools\Static Analysis Tools\\Rule Sets\MinimumRecommendedRules.ruleset" /subsy
  stemversion:6.00 /resource:obj\Debug\WindowsFormsApp.Properties.Resources.resources /target:winexe /utf8output /deter
  ministic+ Form1.cs Form1.Designer.cs Program.cs Properties\AssemblyInfo.cs Properties\Resources.Designer.cs Propertie
  s\Settings.Designer.cs "C:\Users\xxx\AppData\Local\Temp\.NETFramework,Version=v4.6.1.AssemblyAttributes.cs"
  次のディレクトリからのコンパイラでの共有コンパイルを使用しています: C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Ros
  lyn
_CopyAppConfigFile:
  "App.config" から "bin\Debug\WindowsFormsApp.exe.config" へファイルをコピーしています。
CopyFilesToOutputDirectory:
  "obj\Debug\WindowsFormsApp.exe" から "bin\Debug\WindowsFormsApp.exe" へファイルをコピーしています。
  WindowsFormsApp -> C:\Users\xxx\source\repos\WindowsFormsApp\WindowsFormsApp\bin\Debug\WindowsFormsApp.exe
  "obj\Debug\WindowsFormsApp.pdb" から "bin\Debug\WindowsFormsApp.pdb" へファイルをコピーしています。
プロジェクト "C:\Users\xxx\source\repos\WindowsFormsApp\WindowsFormsApp\WindowsFormsApp.csproj" (既定のターゲット) の ビルドが完了しました。


ビルドに成功しました。
    0 個の警告
    0 エラー

経過時間 00:00:00.16

MSBuilddotnet buildの互換性

VC++のプロジェクト、.NET Frameworkのプロジェクトをdotnet buildするとエラーが出ます. 一方、.NET CoreプロジェクトをMSBuildしてもビルドが通りました. dotnet buildではコンパイルオプションの詳細が出力されませんでしたが、MSBuildの場合は詳細が表示されました. その詳細を見るに、.NET Coreプロジェクトをコンパイルするときもcsc.exeを使い、defineなどで.NET Framework用のビルドと.NET Core用のビルドを切り分けているようでした.

対象プロジェクト MSBuild dotnet build
VC++ ×
.NET Framework ×
.NET Core

すなわち、MSBuildはソリューションファイルやプロジェクトファイルから自動的にコンパイラコンパイルオプションを切り替え、適切なビルドを行ってくれるすごいツールだということが分かりました.

余談

C++プロジェクトで「共有DLLでMFCを利用する」を選んでビルドすると、コンパイルオプションに /D _AFXDLLが追加される. どうやらMFCアプリケーションのビルドに必要な追加のインクルードディレクトリ、追加のライブラリディレクトリ、追加の依存ファイルがこのマクロ定数一つで賄える模様. 逆にいうとコマンドラインを見ただけでは本当は何をやってるのかよくわからない.

参考

learn.microsoft.com

learn.microsoft.com

learn.microsoft.com