xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

最新の C# コンパイラ を利用してビルド/デバッグしてみた

そんな方法はひとつしかない、リポジトリをクローンしてビルドすることだ

ということでやってみましょう!ちなみにこの記事は 5/9 現在の情報を基に書いています。近い将来に変更になる可能性は多分にありますので、その点ご了承ください m( )m

Step.1 - Roslyn リポジトリをクローン

C# コンパイラ (Roslyn) はオープンソースなコンパイラで、GitHub で公開されています。HTTPS なり SSH なりでクローンしましょう。

f:id:xin9le:20160508231240p:plain

Step.2 - future ブランチに切り替え

執筆時点では C# 7 は鋭意開発中というステータスです。開発中の機能は基本的にそれごとにブランチが切られていますが、できたもの/いいところまで行ったものは順次 future ブランチにマージされていっています。なので、future ブランチに切り替えましょう。

f:id:xin9le:20160509031853p:plain

Step.3 - Roslyn のビルド

続いて Roslyn をビルドします。cibuild.cmd というバッチファイルがルートフォルダに置いてあるのでこれを使います。既定では Debug ビルドの設定になっているので、Release ビルドの設定に変更します。/release の引数を与えて実行するだけです。

C:\roslyn> cibuild /release

長時間 CPU を全力でブン回しながらビルド / 単体テストが行われます。無事完了したら roslyn\Binaries\Release フォルダに VBCSCompiler.execsc.exe ができているはずです。これを使って C# コードをビルドすれば OK でしょう。

Step.4 - C# プロジェクトで Roslyn コンパイラを参照する

プロジェクト単位での設定を書いているので何度も Hello World プロジェクトを作る方には若干メンドクサイですが、設定してしまえばオシマイです。まず通常のコンソールアプリのプロジェクトを作成します。ビルドした Roslyn コンパイラを利用するため、.csproj ファイルを開いて、PropertyGroup 配下に CscToolPath のタグ設定を追加します。

<PropertyGroup>
    <!-- ↓↓ C# コンパイラのあるフォルダを絶対パスで追加 ↓↓ -->
    <CscToolPath>C:\roslyn\Binaries\Release</CscToolPath>

    <!-- 以下いろいろ既定の設定 -->
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
</PropertyGroup>

続いて C# 7 の機能を有効化するため、条件付きコンパイルシンボルとして __DEMO__ を追加します。GUI 上で設定する場合は、以下の記事を参考にしてくださっても OK です。

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <!-- ↓↓ __DEMO__ を追加 ↓↓ -->
    <DefineConstants>TRACE;DEBUG;__DEMO__</DefineConstants>
</PropertyGroup>

何のコンパイルシンボルでどの C# 7 の機能が有効になるかは CSharpParseOptions.IsFeatureEnabled メソッドに定義されています。このあたりを追いかけておけば新しい機能への反応も早くなるのではないかと思います。

//--- こんな実装がある
internal bool IsFeatureEnabled(MessageID feature)
{
    switch (feature)
    {
        case MessageID.IDS_FeatureBinaryLiteral:
        case MessageID.IDS_FeatureDigitSeparator:
        case MessageID.IDS_FeatureLocalFunctions:
        case MessageID.IDS_FeatureRefLocalsReturns:
        case MessageID.IDS_FeaturePatternMatching:
        case MessageID.IDS_FeatureTuples:
            // in "demo" mode enable proposed new C# 7 language features.
            if (PreprocessorSymbols.Contains("__DEMO__"))
            {
                return true;
            }
            break;
        default:
            break;
    }

    //--- 以下略
}

Step.5 - C# 7 の機能を使ってデバッグ実行

ここまで設定すれば Visual Studio 2015 Update 2 上でコンパイルしてデバッグ実行することができます (∩´∀`)∩

f:id:xin9le:20160509015152p:plain

ただしどうやらインテリセンスが参照しているコンパイラはこの設定とは違うところにあるらしく、コード上では赤波線が出てしまいます。どこの設定をイジれば解決できるか分からないので現時点ではここまで。設定の在り処をご存知の方は教えていただけると嬉しいです m( )m

と、記事公開から数分で届く神回答...!

おまけ - Visual Studio Code でビルドする

Visual Sdutio Code + C# on Windows では現状デバッグはできませんが、ビルドして exe ファイルを作成することはできます.vscode\tasks.json に以下のような設定を入れれば OK!

{
    "version": "0.1.0",
    "command": "C:\\roslyn\\Binaries\\Release\\csc.exe",
    "showOutput": "always",
    "isShellCommand": true,
    "isBuildCommand": true,
    "args": [
        "${workspaceRoot}\\Program.cs",
        "/out:${workspaceRoot}\\Program.exe",
        "/features:binaryLiterals,digitSeparators,localFunctions,refLocalsAndReturns,patterns,tuples"
    ]
}

C# コンパイラに C# 7 の機能をひとつひとつ有効にしているのがお分かりいただけるかと思います。