MSBuildとは、XML形式で記述できるビルド ツールです。たとえばVisual Studioでは、
の実体がMSBuild プロジェクト ファイルとなっています。
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>
要素 | |
---|---|
Choose | |
Import | |
ImportGroup | Importをグループ化する |
Item | |
ItemDefinitionGroup | |
ItemGroup | |
ItemMetadata | |
OnError | |
Otherwise | |
Output | |
Parameter | |
ParameterGroup | |
Project | MSBuildプロジェクトのルート要素 |
ProjectExtensions | |
Property | プロパティの名前と値を格納する |
PropertyGroup | Propertyをグループ化する |
Target | |
Task | |
TaskBody | |
UsingTask | |
When |
要素 | 設定項目 | 設定内容 | 例 |
---|---|---|---|
TargetFrameworkVersion | ターゲット フレームワーク (Target Framework) |
.NET Frameworkの特定のバージョン | v4.0など |
WindowsTargetPlatformVersion | ターゲット プラットフォームのバージョン (Target Platform Version) |
OSのバージョン | 8.1など |
Platform | ターゲット プラットフォーム (Target Platform) |
特定のソフトウェア アーキテクチャ | x86やx64など |
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
<PropertyGroup> <Platform>x86</Platform> <Configuration>Debug</Configuration> <PropertyGroup>
<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 |
<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要素内のCompile要素で、Include属性により指定します。MSBuild 項目 - MSBuild | Microsoft Learn
<ItemGroup> <Compile Include="Program.cs" /> <Compile Include="Form1.cs"> <SubType>Form</SubType> </Compile> <Compile Include="Form1.Designer.cs"> <DependentUpon>Form1.cs</DependentUpon> </Compile> </ItemGroup>
Compile要素は、コンパイラ用のソースファイルを表します。Compile - MSBuild プロジェクトの共通項目 - MSBuild | Microsoft Learn
値 | 種類 |
---|---|
Form | Windows フォーム |
UserControl | ユーザー コントロール |
Component | コンポーネント または カスタム コントロール |
Designer | リソース |
項目に対しては、%(FullPath)
のようなメタデータによる表記も可能です。MSBuild 既知のアイテム メタデータ - MSBuild | Microsoft Learn
また$(AppData)
のような環境変数も適切に解釈されます。c# - Use appdata environment variable in csproj - Stack Overflow
MSBuild.exe [オプション] [プロジェクト ファイル]
ビルドで発生する問題の詳細は、オプションの[プロジェクトおよびソリューション]にある[ビルド/実行]の、[MSBuild プロジェクト ビルドの出力の詳細]のレベルを変更します。指定可能なのは以下の値で、既定では[最小]となっています。[オプション] ダイアログ ボックス、[プロジェクトおよびソリューション]、[ビルド/実行] - Visual Studio 2015 | Microsoft Learn
出力の詳細設定の直後に[MSBuild プロジェクト ビルド ログ ファイルの詳細]という設定項目がありますが、こちらはVisual C++にのみ適用される設定です。
「ファイル "obj\file.exe" を "bin\file.exe" にコピーできません。別のプロセスで使用されているため、プロセスはファイル 'bin\file.exe' にアクセスできません。」
bin\file.exeをロックしているプロセスを終了させます。デバッガが正常に終了せず、このプロセスmsvsmon.exeが原因となることもあります。
「コマンド "command" はコード n で終了しました。」
commandの終了コードnの意味を調べます。
「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 Learn
これは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
「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 Learn
これはプロジェクト名を変更した場合などに発生します。この場合は問題のdirectoryを削除し、ソリューションファイル (.sln) にprojectの名前が残っているならば、それを修正します。visual studio - warning MSB8028: The intermediate directory (Debug\) contains files shared from another project - Stack Overflow
「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を読み込めていないため、そこに含まれるファイルを読み込もうとする処理に対して「ソース ファイルを開けません」としてエラーが発生します。