作为一种新奇的尝试,我正在尝试查看在运行时生成的轻量级代码与VS编译器生成的代码之间的差异,因为我注意到VS代码在处理转换等方面具有不同的性能特征。
于是我编写了以下代码:
Func<object,string> vs = x=>(string)x;
Expression<Func<object,string>> exp = x=>(string)x;
var compiled = exp.Compile();
Array.ForEach(vs.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);
Array.ForEach(compiled.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);
不幸的是,这会抛出异常,因为GetMethodBody在表达式树生成的代码上显然是非法操作。我该如何以库的方式(即除非该工具具有API,否则不使用外部工具)查看使用轻量级代码生成器生成的代码?
编辑:错误发生在第5行,compiled.Method.GetMethodBody()抛出异常。
编辑2:有人知道如何恢复方法中声明的局部变量吗?或者说没有获取变量的方法?