MSBuild

MSBuildとは、XML形式で記述できるビルド ツールです。たとえばVisual Studioでは、

  • C# プロジェクト ファイル (.csproj)
  • Visual Basic プロジェクト ファイル (.vbproj)

の実体がMSBuild プロジェクト ファイルとなっています。

MSBuild プロジェクト ファイル (MSBuild project file)

XMLで記述します。

サンプルコード

Visual Studio 2008で、コンソール アプリケーション (C#) を作成した場合のコードです。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>9.0.21022</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{***}</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>ConsoleApplication</RootNamespace>
    <AssemblyName>ConsoleApplication</AssemblyName>
    <TargetFrameworkVersion>v3.0</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Program.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>

スキーマ要素 (Schema elements)

要素  
Choose  
Import  
ImportGroup Importをグループ化する
Item  
ItemDefinitionGroup  
ItemGroup  
ItemMetadata  
OnError  
Otherwise  
Output  
Parameter  
ParameterGroup  
Project MSBuildプロジェクトのルート要素
ProjectExtensions  
Property プロパティの名前と値を格納する
PropertyGroup Propertyをグループ化する
Target  
Task  
TaskBody  
UsingTask  
When  
MSBuild Project File Schema Reference | MSDN

ターゲットの設定

要素 設定項目 設定内容
TargetFrameworkVersion ターゲット フレームワーク
(Target Framework)
.NET Frameworkの特定のバージョン v4.0など
WindowsTargetPlatformVersion ターゲット プラットフォームのバージョン
(Target Platform Version)
OSのバージョン 8.1など
Platform ターゲット プラットフォーム
(Target Platform)
特定のソフトウェア アーキテクチャ x86やx64など
MSBuild ターゲット フレームワークおよびターゲット プラットフォーム | MSDN
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
<PropertyGroup>
   <Platform>x86</Platform>
   <Configuration>Debug</Configuration>
<PropertyGroup>
PlatformToolset
<PlatformToolset>v90</PlatformToolset>

値はVisual Studioのバージョン番号に対応し、たとえばVisual Studio 2008のバージョン番号は「9.0」であることから「v90」のように指定します。

対象
Visual Studio 2008 v90
Visual Studio 2010 v100
Visual Studio 2012 v110
Visual Studio 2012 (XP用) v110_xp
Visual Studio 2013 v120
Visual Studio 2013 (XP用) v120_xp
Visual Studio 2015 v140
Visual Studio 2015 (XP用) v140_xp
c - when should I use VS2015 platform toolset V140_XP? - Stack Overflow

参照の設定

<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />

ソリューションの構成やプラットフォームで参照するファイルが異なるときには、Condition属性でそれぞれを指定します。

<Reference Include="SAMPLE">
  <HintPath Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">Win32\debug.dll</HintPath>
  <HintPath Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">Win32\release.dll</HintPath>
</Reference>

Visual Studio上ではこのような指定はできないため、プロジェクト ファイルの書き換えが必要となります。C#プロジェクトでRelease/Debugアセンブリを切り替える方法 (2012/08/01)

ファイルの指定

ビルドシステムに渡すファイルを指定できます。

ItemGroup要素内の要素で、Include属性により指定します。MSBuild Items | MSDN

<ItemGroup>
  <Compile Include="Program.cs" />
  <Compile Include="Form1.cs">
    <SubType>Form</SubType>
  </Compile>
  <Compile Include="Form1.Designer.cs">
    <DependentUpon>Form1.cs</DependentUpon>
  </Compile>
</ItemGroup>
SubType要素
種類
Form Windows フォーム
UserControl ユーザー コントロール
Component コンポーネント または カスタム コントロール
Designer リソース

MSBuildの実行

コマンドプロンプトからの利用

MSBuild.exe [オプション] [プロジェクト ファイル]

Visual Studioからの利用

ビルドで発生する問題の詳細は、オプションの[プロジェクトおよびソリューション]にある[ビルド/実行]の、[MSBuild プロジェクト ビルドの出力の詳細]のレベルを変更します。指定可能なのは以下の値で、既定では[最小]となっています。[オプション] ダイアログ ボックス、[プロジェクトおよびソリューション]、[ビルド/実行] - Visual Studio 2015 | Microsoft Docs

  • 簡易 (Quiet)
  • 最小 (Minimal)
  • 標準 (Normal)
  • 詳細 (Detailed)
  • 診断 (Diagnostic)

出力の詳細設定の直後に[MSBuild プロジェクト ビルド ログ ファイルの詳細]という設定項目がありますが、こちらはVisual C++にのみ適用される設定です。

MSBuild実行時のエラー

MSB3021

ファイル "obj\file.exe" を "bin\file.exe" にコピーできません。別のプロセスで使用されているため、プロセスはファイル 'bin\file.exe' にアクセスできません。

bin\file.exeをロックしているプロセスを終了させます。デバッガが正常に終了せず、このプロセスmsvsmon.exeが原因となることもあります。

MSB3073

コマンド "command" はコード n で終了しました。

commandの終了コードnの意味を調べます。

MSB8012

Microsoft.CppBuild.targets(1189,5): warning MSB8012: TargetPath(C:\file1.dll) does not match the Linker's OutputFile property value (C:\file2.dll). This may cause your project to build incorrectly. To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property values match the value specified in %(Link.OutputFile).MSBuild Error MSB8012 | Microsoft Docs

これはMicrosoft.CppBuild.targetsの条件、

<VCMessage Condition="'@(_OutputFileFromLink)' != '' and '%(_OutputFileFromLink.FullPath)' != '$([System.IO.Path]::GetFullPath($(TargetPath)))'" Code="MSB8012" Type="Warning" Arguments="TargetPath;$(TargetPath);Linker;%(_OutputFileFromLink.FullPath);Link"/>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppBuild.targets

に一致しないのが原因であり、これが意図したものでなければリンカーの出力ファイル (Link.OutputFile) を、「$(OutDir)$(TargetName)$(TargetExt)」に修正します。visual studio 2010 - warning MSB8012 : make sure that $(OutDir), $(TargetName) and $(TargetExt) property values match the value specified in %(Link.OutputFile) - Stack Overflow

MSB8028

The intermediate directory (directory\) contains files shared from another project (project.vcxproj). This can lead to incorrect clean and rebuild behavior.MSBuild Error MSB8028 | Microsoft Docs

これはプロジェクト名を変更した場合などに発生します。この場合は問題のdirectoryを削除し、ソリューションファイル (.sln) にprojectの名前が残っているならば、それを修正します。visual studio - warning MSB8028: The intermediate directory (Debug\) contains files shared from another project - Stack Overflow

MSB8036

The Windows SDK version number was not found. Install the required version of Windows SDK or change the SDK version in the project property pages or by right-clicking the solution and selecting "Retarget solution".

インストールされていないバージョンのSDKを指定しているのが原因です。これは指示通りそのバージョンのSDKをインストールするか、プロジェクトのプロパティページの【全般 → ターゲット プラットフォーム バージョン】またはソリューション エクスプローラで対象のプロジェクトを右クリックし、[SDK バージョンの再ターゲット]からSDKのバージョンを変更します。

このエラーが発生するときはそのSDKを読み込めていないため、そこに含まれるファイルを読み込もうとする処理に対して「ソース ファイルを開けません」としてエラーが発生します。

MSDN (Microsoft Developer Network) から検索