次のように CIL で定義された 1 つのフィールドがあります。
.field public int32 modopt(void*) fld
これをアセンブリにコンパイルします。今、私はそれを次のように変更します:
.field public int32 modopt(int16) fld
両方とも、ILDASM が (16 進数で表示されている場合)両方のフィールドを次のように報告することができるようになったのはなぜですか?
Field #1 (04000001)
-------------------------------------------------------
Field Name: fld (04000001)
Flags : [Public] (00000006)
CallCnvntn: [FIELD]
Field type: CMOD_OPT 1b000001 I4
Signature : 06 20 06 08
このコードは、両方のフィールドをまったく同じように検索します (実際には、報告された署名と一致するように 2 番目のフィールドを作成しました)。署名は明らかに 2 番目のフィールドと一致しますが、最初のフィールドの署名は次のようになります06 20 0f 01 08
。ここで何が欠けていますか?
編集:
C# はこのタイプのフィールドを生成できず、カスタム型修飾子でサポートされていないポインターおよび配列型に関する例外をスローするため、これによりシグネチャの不一致が明らかに解決されます。しかし、なぜ ILDASM が逆コンパイルできない無効な署名の作成を許可するのかという疑問が残ります。
編集#2:
ILASM が実際に正しい IL を作成しているようです。前回見逃した 16 進ダンプに違いがあります。
//the first assembly
TypeSpec #1 (1b000001)
-------------------------------------------------------
TypeSpec : Ptr Void
Signature: 0f 01
//the second assembly
TypeSpec #1 (1b000001)
-------------------------------------------------------
TypeSpec : I2
Signature: 06
したがって、ILDASM 16 進ダンプには、間違ったメンバー署名を報告するバグがあります (ただし06
、間違った署名がどこから来たのか疑問に思います)。