2016-03-02 25 views
5

私はC#のソースコードfile.Iはロスリンでソリューションを開いたと私は今、ILを取得する方法ISymbolを持ってroslynでメソッド本体のilを取得するには?

Roslyn.Compilers.Common.ISymbol s=GetMethodSymbolAtPosition (30); 

以下のような方法のシンボルを見つけることがありますか?に1つの方法のILを取得したいですか

+0

コードをコンパイルして本文を取得します。これは、Roslynがコンテキストなしで1つのソースファイルで1つのメソッドをコンパイルするだけのものではありません:) – Luaan

+0

なぜILは必要ですか?あなたはそれで何をしたいですか? – svick

答えて

7

残念ながら、IL生成はRoslynのEmitコール内に完全に隠されています。しかし、私はあなたが簡単に始められるようにします。

のでは、既存のコンパイルでの開始としましょう:methodはあなたのISymbol

var initial = CSharpCompilation.Create("Existing") 
    .AddReferences(MetadataReference.CreateFromFile(typeof(object).Assembly.Location)) 
    .AddSyntaxTrees(SyntaxFactory.ParseSyntaxTree(@"  
     namespace Test 
     { 
      public class Program 
      { 
       public static void HelloWorld() 
       { 
        System.Console.WriteLine(""Hello World""); 
       } 
      } 
     }"));  
var method = initial.GetSymbolsWithName(x => x == "HelloWorld").Single(); 

です。その後、次の操作を行うことができます。より複雑な場合には

// 1. get source 
var methodRef = method.DeclaringSyntaxReferences.Single(); 
var methodSource = methodRef.SyntaxTree.GetText().GetSubText(methodRef.Span).ToString(); 

// 2. compile in-memory as script 
var compilation = CSharpCompilation.CreateScriptCompilation("Temp") 
    .AddReferences(initial.References) 
    .AddSyntaxTrees(SyntaxFactory.ParseSyntaxTree(methodSource, CSharpParseOptions.Default.WithKind(SourceCodeKind.Script))); 

using (var dll = new MemoryStream()) 
using (var pdb = new MemoryStream()) 
{ 
    compilation.Emit(dll, pdb); 

    // 3. load compiled assembly 
    var assembly = Assembly.Load(dll.ToArray(), pdb.ToArray()); 
    var methodBase = assembly.GetType("Script").GetMethod(method.Name, new Type[0]); 

    // 4. get il or even execute 
    var il = methodBase.GetMethodBody(); 
    methodBase.Invoke(null, null); 
} 

は、おそらく初期/全体のコンパイルを放出する必要がある、と反射によって生成されたメソッドを取得したいです。

GetMethodBody()の結果でできることを確認するには、this postを参照してください。

+0

"残念ながら、IL生成はRoslynのEmit呼び出し内に完全に隠されています。" RoslynのどこにILが生成されているか知っていますか? (Roslynは巨大なプログラムです - 私はちょうどそれを見て始めています - そして、私はいくつかのC#ステートメントのために生成されたILを微調整しようと思います。) – RenniePet

関連する問題