我只是对 msil 操作码等感兴趣。通常我在 C# 中编程并尝试使用 Reflection.Emit / MethodBuilder 动态生成方法,但这需要操作码。
因此,如果可以通过将 C# 解析为 msil 并在 Method Builder 中使用它来动态生成方法,我很感兴趣?
那么是否可以通过使用反射和 C# 代码在运行时动态生成方法?
You could take a look at expression trees, CodeDom
, CSharpCodeProvider
etc.
using System.CodeDom.Compiler;
using Microsoft.CSharp;
// ...
string source = @"public static class C
{
public static void M(int i)
{
System.Console.WriteLine(""The answer is "" + i);
}
}";
Action<int> action;
using (var provider = new CSharpCodeProvider())
{
var options = new CompilerParameters { GenerateInMemory = true };
var results = provider.CompileAssemblyFromSource(options, source);
var method = results.CompiledAssembly.GetType("C").GetMethod("M");
action = (Action<int>)Delegate.CreateDelegate(typeof(Action<int>), method);
}
action(42); // displays "The answer is 42"