ich ein Feld in CIL wie folgt definiert haben:Verschiedene Arten haben gleiche Signaturen in CIL
.field public int32 modopt(void*) fld
ich dies zu einer Baugruppe zusammenstellen. Jetzt wechsle ich es zu:
.field public int32 modopt(int16) fld
Beide, wie ist es möglich, jetzt, dass ILDASM Berichte (wenn sie als hex dargestellt) beide diese Felder als das?
Field #1 (04000001)
-------------------------------------------------------
Field Name: fld (04000001)
Flags : [Public] (00000006)
CallCnvntn: [FIELD]
Field type: CMOD_OPT 1b000001 I4
Signature : 06 20 06 08
Dieser Code sucht nach beiden Feldern genau die gleiche (tatsächlich habe ich das zweite Feld erstellt, um die gemeldete Signatur zu entsprechen). Die Signatur stimmt offensichtlich mit dem zweiten Feld überein, aber die Signatur des ersten Feldes sollte so aussehen: 06 20 0f 01 08
! Was fehlt mir hier?
Edit:
C# kann nicht diese Art von Feld emittieren, eine Ausnahme zu Zeiger- und Array-Typen nicht für das Werfen benutzerdefinierten Typ Modifikatoren unterstützt, so dass diese löst anscheinend die Signatur Mismatch. Aber die Frage, warum ILDASM eine ungültige Signatur erstellen kann, die nicht dekompiliert werden kann, bleibt bestehen.
Edit # 2:
Es scheint ILASM eigentlich richtig IL schafft, gibt es einen Unterschied in der Hex-Dump ich das letzte Mal verpasst:
//the first assembly
TypeSpeC#1 (1b000001)
-------------------------------------------------------
TypeSpec : Ptr Void
Signature: 0f 01
//the second assembly
TypeSpeC#1 (1b000001)
-------------------------------------------------------
TypeSpec : I2
Signature: 06
So ist es nur ein Fehler in ILDASM hex dump meldet falsche Mitgliedssignatur (obwohl ich mich frage, woher die in der falschen Signatur stammt).
Um die offensichtliche Frage zu stellen: Was lässt Sie denken, dass es "06 20 0f 01 08" sein sollte? Gibt es einen Zusammenbruch/Hinweis darauf? –
@Marc Ich habe in der ECMA von CLI gesucht. Der Elementtyp von modopt ist "20", der Elementtyp von Zeiger ist "0f", von void ist er "01". Um also alle zusammen aufzustehen, sollte die Signatur von 'modopt (void *)' '20 0f 01' sein (' 06' ist Feld Callconv und '08' ist int32). – IllidanS4
ist das C#? Ich sehe Leere *! – niceman