2015-01-06 11 views
7

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).

+0

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? –

+0

@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

+0

ist das C#? Ich sehe Leere *! – niceman

Antwort

1

Versuchen wir, die Feldsignatur basierend auf the specification manuell zu erstellen. Zu Beginn ist die Feldsignatur in §II.23.2.4 definiert. Für unseren Fall mit einem benutzerdefinierten Modifikator, wird es sein:

FIELD CustomMod Type 

Da FIELD als 0x06 definiert ist, haben wir:

06 CustomMod Type 

Unsere kundenspezifischen Modifikator modopt, so erhalten wir (basierend auf Artikel II .23.2.7):

06 CMOD_OPT TypeDefOrRefOrSpecEncoded Type 

CMOD_OPT ist 0x20 (§II.23.1.16):

06 20 TypeDefOrRefOrSpecEncoded Type 

Wir möchten TypeSpec 0x1b000001 referenzieren, die als 0b110 codiert ist (10 für TypeSpec, 1 für 0x000001, §II.23.2.8). Dies ist dann "compressed" in die einzelnen Byte 0x06 (§II.23.2):

06 20 06 Type 

schließlich der Typ int32 ist, die ELEMENT_TYPE_I4 = 0x08 (§II.23.2.12 und §II.23.1 ist. 16):

06 20 06 08 

So erhalten wir genau die gleiche Signatur wie die in ILDasm.

+0

Danke, das macht viel mehr Sinn. Ich dachte, es sollte Typ-Signatur sein, nicht Typ-Token, also interpretierte ich die Ergebnisse von ILDasm falsch. – IllidanS4