NAKED WETWARE

「わがままになるのが怖い奴に宇宙は拓けねェさ」

MSBuildの使い方

Windowsには、標準でC#コンパイラ(csc.exe)があります。 なので、VisualStudio(VS)がなくても、C#によるコーディングができます。

ただ、リンクとかめんどくさく、できればもっと簡単にコーディングできるようにしたいです。

MSBuild.exeというも、Windows標準に入ってます。 これを使えばVSなしでビルドができます。

今回は、この使い方をまとめて行きたいと思います。

最終目標は、MSBuildを使ってDebugシンボルを使ったビルド切り替えができるところまでやります。

イメージとしては、MSBuildC#特化のMakeみたいな感じです。

詳しくはGitHubサンプルおいておいたので、そちらを確認ください。

TL;DR

MSBuildとは

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

https://docs.microsoft.com/ja-jp/visualstudio/msbuild/msbuild?view=vs-2017を読んでおけばおk。

VSなしでアプリケーションをビルドするプラットフォームです。

ソースを準備する

Hello, Worldを表示する簡単なプログラム。

DEBUGシンボルを使って、ビルドを切り替えてます。

using System;

namespace Program1 {
    class Program {
        static void Main(string[] args) {
#if DEBUG
            Console.WriteLine("Hello, DEBUG!");
#else
            Console.WriteLine("Hello, world!");
#endif
        }
    }
}

MSBuildにPathを通す。

パスは以下。

C:\Windows\Microsoft.NET\Framework\v4.0.30319

Frameworkv4.0.30319はお好みに合わせて変更します。

ちなみに、上記Pathにcsc.exe(C#コンパイラ)もいます。

hoge.csprojを作成する。

hoge.csprojファイルでビルドの詳細を設定します。

VSで、プロジェクト > プロパティ で設定できる項目は、大体設定できる印象。

注意点は以下。

ToolVersionは4.0

ToolVersionを4.0と書かないと、WinForm系のビルドができなかった気がする。

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.CSharp.targetsは安牌

上記ファイルを読み込んでおけば、コンパイラの設定をしなくてもDebugシンボルが使えるようになる。

使nい場合は、csprojファイル内に<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />と書きます。

安牌を使わない場合

PropertyGroupで、Debug/Release時の設定をそれぞれを行います。

その後、Target要素の中に、CSC要素を追加します。

CSC要素の属性値DefineConstantsでDebug/Releaseを指定します。

<PropertyGroup>
    <AssemblyName>helloworld</AssemblyName>
</PropertyGroup>

<!-- Releas以外はすべてDebugとする -->
<PropertyGroup>
    <OutputPath>bin\Debug\</OutputPath>
    <DebugSymbols>true</DebugSymbols>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release'">
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
</PropertyGroup>
<ItemGroup>
    <Compile Include="*.cs" />
</ItemGroup>

<Target Name="Build" Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe" >
    <Message text="DefineConstants: $(DefineConstants)" />
    <Message text="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
    <Message text="Create: $(OutputPath)$(AssemblyName).exe" />
    <Csc
        Sources="@(Compile)"
        OutputAssembly="$(OutputPath)$(AssemblyName).exe"
        DefineConstants="$(DefineConstants)"
    />
</Target>

ビルドする

-tがターゲット指定、-pがプロパティ指定をする、それぞれのオプションです。

上記のようにcsprojファイルが記述されている前提ですが、Debugビルドをする場合は、-pオプションで指定します。

$ msbuild -t:build -p:Configuration=Debug

終わりに

プロジェクトによっては、自由にアプリケーションや実行環境を導入できない場合があります。 (というか、それがだいたいです)

Windowsだったら、それでもC#が使えるので、代替品を自作することができます。

(Linuxならもっと自由ですが)

C#で自作ツールを作成し、貧弱なWindows環境でもちょびっとだけ業務効率を上げることが出そうです。

これで、QOLがちょびっとだけ上がった。