【发布时间】:2013-09-23 17:36:11
【问题描述】:
我正在尝试使用 .NET 中的反射和发射来生成动态程序集。我收到错误消息“公共语言运行时检测到无效程序”。我创建了另一个程序,它具有我想要使用硬编码类型的功能。我尝试编写的功能最终将使用动态类型,但我可以使用 ILDasm 来查看我需要生成的 IL。我正在将我生成的 IL 与编译器生成的 IL 进行比较。在一种方法的 .locals 初始化声明中,我看到编译器生成的代码中有一个额外的项目,
编译器生成:
.locals init ([0] class [System.Core]System.Linq.Expressions.ParameterExpression CS$0$0000,
[1] class [System.Core]System.Linq.Expressions.ParameterExpression[] CS$0$0001)
我的:
.locals init (class [System.Core]System.Linq.Expressions.ParameterExpression V_0,
class [System.Core]System.Linq.Expressions.ParameterExpression[] V_1)
我不明白编译器生成的代码中“[0]”和“[1]”的意义。谁能告诉我这是什么意思?
作为一个更普遍的问题,我可以毫不费力地跟踪大多数 ILDasm 输出。但是我经常遇到一个有问题的表达式。例如,在 ILDasm 的这一行中
callvirt instance class [EntityFramework]System.Data.Entity.ModelConfiguration.EntityTypeConfiguration`1<!!0> [EntityFramework]System.Data.Entity.DbModelBuilder::Entity<class DynamicEdmxTrial.HardFooAsset>()
“!!0”可能指的是 Entity 的泛型类型,但我不确定,我想知道 ILDasm 输出是否有一个键可以向我解释其更晦涩的输出.
【问题讨论】:
-
“我收到一个错误,“公共语言运行时检测到一个无效程序。””您是否尝试过在您的程序集上运行 PEVerify?
-
另外,您究竟是如何获得这些
.locals的?都来自 ILDasm? -
“无效程序”我不是很在意。我想我已经找到了。两个 .local 声明都来自 ILDasm。它显然发现了 C# 代码和我的 Reflection.Emit 之间的一些差异。
-
考虑到 ILDasm 输出包含变量名(在 IL 中没有表示),也许这些数字与调试信息有关?
-
对于那些寻求关闭这类事情的人来说,无效程序的事情与“[0]”无关。我正在调用一个基本构造函数,它接受一个参数而不将一个参数压入堆栈。我已经改变了我需要调用哪个构造函数的想法,但忘记添加参数了。
标签: reflection.emit il ildasm