gpt4 book ai didi

c# - 如何使用 roslyn 获得一种方法体的 il?

转载 作者:太空狗 更新时间:2023-10-29 22:30:20 25 4
gpt4 key购买 nike

我想在我的 c# 源代码文件中获取一个方法的 il。我已经用 roslyn 打开了解决方案并找到了如下所示的方法符号

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

我有一个 ISymbol 现在如何获取它?

最佳答案

不幸的是,IL 生成完全隐藏在 Roslyn 的 Emit 调用中。但我会提供一个简单的入门指南。

假设您从现有的编译开始:

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();

method 是您的 ISymbol。然后您可以执行以下操作:

// 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);
}

在更复杂的情况下,您可能需要发出整个/初始编译,并通过反射获取生成的方法。

引用this post了解您可以使用 GetMethodBody() 的结果做什么。

关于c# - 如何使用 roslyn 获得一种方法体的 il?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35741219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com