在表达树上调用Compile()时,是否可以查看生成的IL代码?考虑这个非常简单的例子:

class Program
{
    public int Value { get; set; }

    static void Main(string[] args)
    {
        var param = Expression.Parameter(typeof(Program));
        var con = Expression.Constant(5);
        var prop = Expression.Property(param, typeof(Program).GetProperty("Value"));
        var assign = Expression.Assign(prop, con);
        Action<Program> lambda = Expression.Lambda<Action<Program>>(assign, param).Compile();

        Program p = new Program();
        lambda(p);



        //p.Value = 5;
    }
}

现在,表达树完成了最后一行 Main 说。编译应用程序,然后在反射器中打开。您可以看到IL代码 p.Value = 5; 那是分配的。但是表达树是在运行时制作和编译的。是否可以从编译中查看所得的IL代码?

有帮助吗?

解决方案

是的!使用此工具:

https://github.com/drewnoakes/il-visualizer

我可以想象,当我实施和调试编译时,这非常有用。

其他提示

创建一个动态设备,然后创建一个动态模块,动态型和DynamicMethod。将该方法公开和静态,然后将其传递到lambda上的方法compileto()。当您将汇编标记为保存时。然后调用保存()方法并通过路径。它将写入磁盘。在反射器中弹出它。

就像是:

var da = AppDomain.CurrentDomain.DefineDynamicAssembly(
    new AssemblyName("dyn"), // call it whatever you want
    AssemblyBuilderAccess.Save);

var dm = da.DefineDynamicModule("dyn_mod", "dyn.dll");
var dt = dm.DefineType("dyn_type");
var method = dt.DefineMethod(
    "Foo", 
    MethodAttributes.Public | MethodAttributes.Static);

lambda.CompileToMethod(method);
dt.CreateType();

da.Save("dyn.dll");
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top