我正在尝试使用 .NET 中的反射和发射生成动态程序集。我收到错误消息“公共语言运行时检测到无效程序”。我创建了另一个程序,它具有我想要使用硬编码类型的功能。我尝试编写的功能最终将使用动态类型,但我可以使用 ILDasm 来查看我需要生成的 IL。我正在将我生成的 IL 与编译器生成的 IL 进行比较。在一种方法的 .locals init 声明中,我看到编译器生成的代码中有一个额外的项目,
编译器生成:
.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 输出是否有一个键可以向我解释它更晦涩的输出。