Amy*_*Amy 30 c# il expression-trees .net-reflector
是否可以查看在Expression树上调用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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,表达式树执行最后一行Main所说的内容.编译应用程序,然后在Reflector中打开它.您可以看到p.Value = 5;执行分配的IL代码.但表达式树是在运行时编译和编译的.是否可以从编译中查看生成的IL代码?
Eri*_*ert 28
是! 使用此工具:
https://github.com/drewnoakes/il-visualizer
当我实现和调试Compile时,这非常有用,因为我相信你可以想象.
jus*_*ase 24
创建DynamicAssembly,然后创建DynamicModule,DynamicType和DynamicMethod.将该方法设为public和static,并将其传递给lambda上的方法CompileTo().当你将程序集标记为Save时.然后调用Save()方法并传递路径.它将被写入磁盘.在反射器中打开它.
就像是:
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");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9602 次 |
| 最近记录: |