[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 を用いて、動的にメソッドを生成するプログラムを作成した。
これで三通りの方法を試したことになる。次回は、これらのパフォーマンスを比較してみよう。
関連
関連記事
Sandcastle – September 2007 Community Technology Preview (CTP)
"Sandcastle" は、、ソースコードの XMLコメン ...
[C#][.NET][Roslyn][式木] Room metro #23 大阪「メタプログラミング C#」の資料公開
Room metro #23 大阪 (3月1日) でやったセッションの資料を公開 ...
[C#][ラムダ式][LINQ][式木] 匿名メソッドとラムダ式の違い
この記事では、匿名メソッドとラムダ式の意味の違いについて考えてみたい。 ■ 同じ ...
[C#][dynamic] DynamicObject を使ってみよう
C# 4 から dynamic が使えるようになった。 動的言語のように、動的に ...
.NET Core 3.0 正式版リリース
.NET Core 3.0 正式版リリース 昨日 (2019/09/23)、.N ...
ディスカッション
コメント一覧
まだ、コメントがありません