私はC#のソースコードfile.Iはロスリンでソリューションを開いたと私は今、ILを取得する方法ISymbolを持ってroslynでメソッド本体のilを取得するには?
Roslyn.Compilers.Common.ISymbol s=GetMethodSymbolAtPosition (30);
以下のような方法のシンボルを見つけることがありますか?に1つの方法のILを取得したいですか
私はC#のソースコードfile.Iはロスリンでソリューションを開いたと私は今、ILを取得する方法ISymbolを持ってroslynでメソッド本体のilを取得するには?
Roslyn.Compilers.Common.ISymbol s=GetMethodSymbolAtPosition (30);
以下のような方法のシンボルを見つけることがありますか?に1つの方法のILを取得したいですか
残念ながら、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を参照してください。
"残念ながら、IL生成はRoslynのEmit呼び出し内に完全に隠されています。" RoslynのどこにILが生成されているか知っていますか? (Roslynは巨大なプログラムです - 私はちょうどそれを見て始めています - そして、私はいくつかのC#ステートメントのために生成されたILを微調整しようと思います。) – RenniePet
コードをコンパイルして本文を取得します。これは、Roslynがコンテキストなしで1つのソースファイルで1つのメソッドをコンパイルするだけのものではありません:) – Luaan
なぜILは必要ですか?あなたはそれで何をしたいですか? – svick