[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 を用いて、動的にメソッドを生成するプログラムを作成した。
これで三通りの方法を試したことになる。次回は、これらのパフォーマンスを比較してみよう。
関連
関連記事
.NET Core 3.0 正式版リリース
.NET Core 3.0 正式版リリース 昨日 (2019/09/23)、.N ...
[C#][.NET] メタプログラミング入門 – 応用編 – オブジェクトの文字列変換のメタプログラミング (Reflection.Emit 編)
※ 「 メタプログラミング入門 - 応用編 - オブジェクトの文字列変換のメタプ ...
[C#][.NET] Shos.UndoRedoList (List and ObservableCollection which support undo/redo)
Click here for Japanese version (日本語版はこち ...
[C#][.NET][Roslyn] Build 2014 でオープンソースになったと発表された Roslyn のソースコードを弄ってみた
Build 2014 での Roslyn 関連の発表 先日、マイクロソフトの開発 ...
[C#][.NET][Roslyn] メタプログラミング入門 – Roslyn による C# ソースコードの解析と変更
この記事は、「C# Advent Calendar 2013」の 12 月 12 ...
ディスカッション
コメント一覧
まだ、コメントがありません