[C#][.NET][Roslyn] メタプログラミング入門 – Roslyn による Add メソッドの動的生成

※ 「[C#][.NET] メタプログラミング入門 – 式木による Add メソッドの動的生成」の続き。
Roslyn によるメタプログラミング
前回は、式木を用いて Add メソッドを動的生成するプログラムを作成した。
今回は、Roslyn によるメソッドの動的生成だ。
Roslyn は、「Roslyn による Visual Studio のアドイン」で紹介したが、C# や Visual Basic のコンパイラーの内部の API 等を公開したものだ。
本稿執筆時点では CTP (Community Technology Preview) と呼ばれる評価版だが、これを用いて、C# のソースコードから、プログラムを生成することができる。
Roslyn のインストール
先ずは、Roslyn をインストールしよう。
Visual Studio の「ソリューション エクスプローラー」でプロジェクト名を右クリックし、「Nuget パッケージの管理…」を選ぶ。

「Nuget パッケージの管理」ダイアログボックスが開くので、右上の「オンラインの検索」エディット ボックスに「Roslyn」と入力し、検索する。

暫く待って表示されたリストの中から「Roslyn」を選び、「インストール」する。
動的に生成するメソッド
今回も次の Add メソッドを生成する。
// 普通の静的な Add メソッド
static int Add(int x, int y)
{
return x + y;
}
Roslyn を使うソースコードは次のようになる。
using Roslyn.Scripting.CSharp;
using System;
static class Program
{
// Roslyn による Add メソッドの生成
static Func<int, int, int> AddByRoslyn()
{
var engine = new ScriptEngine(); // C# のスクリプトエンジン
var session = engine.CreateSession();
session.ImportNamespace("System"); // System 名前空間のインポート
return (Func<int, int, int>)session.Execute(code: "(Func<int, int, int>)((x, y) => x + y)");
}
static void Main()
{
var addByRoslyn = AddByRoslyn(); // デリゲートを動的に生成
var answerByRoslyn = addByRoslyn(1, 2); // 生成したメソッドの呼び出し
Console.WriteLine("answerByRoslyn: {0}", answerByRoslyn);
}
}
C# のソースコードを直接扱えるので、Reflection.Emit を使った場合や式木を使った場合と
比較して、とても簡潔に書ける。
実行してみると、これも次のように正しく動作する。
answerByRoslyn: 3
まとめ
今回は、Roslyn を用いて、動的にメソッドを生成するプログラムを作成した。
これで三通りの方法を試したことになる。次回は、これらのパフォーマンスを比較してみよう。
関連
関連記事
[C#][Design Pattern][DynamicObject][dynamic] C# による Observer パターンの実装 その6 – DynamicObject を使ってオブザーバーを作る
※ C# Advent Calender 2012 の 25日目のエントリー。 ...
[Event] 「BuriKaigi2019」 (2019年1月26日)を開催しました
富山県黒部市宇奈月温泉で、毎年恒例の勉強会「BuriKaigi2019」を開催し ...
[C#][.NET][Roslyn] メタプログラミング入門 – Roslyn による C# ソースコードの解析と変更
この記事は、「C# Advent Calendar 2013」の 12 月 12 ...
[C#][.NET][CodeDOM] メタプログラミング入門 – CodeDOM によるクラスの生成
※ 「 メタプログラミング入門 - CodeDOM による Hello worl ...
C#がJISに制定
C#言語がJIS (Japanese Industrial Standard: ...
ディスカッション
コメント一覧
まだ、コメントがありません