【发布时间】:2010-11-10 16:55:15
【问题描述】:
作为一个新奇事物,我试图看看 IL 与运行时生成的轻量级代码与 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: 有谁知道如何恢复方法中声明的局部变量?还是没有办法GetVariables?
【问题讨论】:
-
哪一行抛出异常?你能注释掉第一个 Array.ForEach 并看看它是否有效吗?我怀疑对 GetMethodBody() 的第一次调用失败仅仅是因为该表达式尚未编译为 IL。我看不出第二次调用失败的原因。
-
有趣的问题。我在 GetMethodBody 调用中收到 InvalidOperationException("Operation in not valid due to the current state of the object")。我不确定从 CachedAnonymousDelegate 与 Expression 开始生活会如何影响您作为 Func 的行为。我会继续做这个。
-
应切换所选答案,因为它不涵盖所有情况并且不必要地复杂。请参阅this answer。
-
对于局部变量,我相信你必须访问 m_localSignature 并根据 ECMA 335 解析它
标签: c# dynamicmethod