.NET で Reflection & Emit を使用して動的アセンブリを生成しようとしています。「共通言語ランタイムが無効なプログラムを検出しました」というエラーが表示されます。ハードコーディングされた型を使用して、必要な機能を持つ別のプログラムを作成しました。私が書こうとしている機能は、最終的には動的な型を使用しますが、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出力にキーがあり、そのよりあいまいな出力を説明してくれるのではないかと思います。