[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#][.NET][CodeDOM] メタプログラミング入門 – CodeDOM による Hello world!
※ 「 メタプログラミング入門 - 応用編 - オブジェクトの文字列変換のメタプ ...
[C#][.NET][CodeDOM] メタプログラミング入門 – CodeDOM によるクラスの生成
※ 「 メタプログラミング入門 - CodeDOM による Hello worl ...
新たな Web アプリケーションフレームワーク「Blazor」 ‐ ネイティブ アプリケーション開発も可能に
日本時間で昨日、「.NET Conf: Focus on Blazor」というオ ...
[C#][.NET] メタプログラミング入門 – 応用編 – オブジェクトの文字列変換のメタプログラミング (パフォーマンスのテスト)
※ 「 メタプログラミング入門 - 応用編 - オブジェクトの文字列変換のメタプ ...
[Event] 「富山合同勉強会 .NET & Java – MVP Community Camp 2015 北陸会場 -」が開催されました
※ 「MVP Community Camp 2015 (2015年1月31日) ...
ディスカッション
コメント一覧
まだ、コメントがありません