2015-01-06 5 views
7

में एक ही हस्ताक्षर किया है। कि ILDASM रिपोर्ट (जब हेक्स के रूप में दिखाया गया है) दोनों उन इस जैसे क्षेत्रोंविभिन्न प्रकार मैं एक क्षेत्र इस तरह कोल इंडिया में परिभाषित किया गया है सीआईएल

.field public int32 modopt(int16) fld 

दोनों कैसे यह अब संभव है, अब मैं इसे करने के लिए बदलते हैं?

Field #1 (04000001) 
------------------------------------------------------- 
    Field Name: fld (04000001) 
    Flags  : [Public] (00000006) 
    CallCnvntn: [FIELD] 
    Field type: CMOD_OPT 1b000001 I4 
    Signature : 06 20 06 08 

इस कोड को दोनों क्षेत्रों के लिए लग रहा है ठीक उसी (वास्तव में मैं सूचना हस्ताक्षर से मेल करने के लिए दूसरे क्षेत्र बना लिया है)। हस्ताक्षर स्पष्ट रूप से दूसरे क्षेत्र से मेल खाता है, लेकिन पहले क्षेत्र का हस्ताक्षर इस तरह दिखना चाहिए: 06 20 0f 01 08! मुझे यहां क्या समझ नहीं आ रहा है?

संपादित करें:

सी # इस प्रकार की फेंकना नहीं कर सकते, कस्टम प्रकार संशोधक के लिए समर्थित नहीं सूचक और सरणी प्रकार के बारे में एक अपवाद फेंक, तो यह जाहिरा तौर पर हस्ताक्षर बेमेल हल करती है। लेकिन सवाल यह है कि क्यों ILDASM एक अवैध हस्ताक्षर बनाने की अनुमति देता है जो यह अवशेषों को कम नहीं कर सकता है।

# 2 संपादित करें:

यह ILASM वास्तव में सही आईएल पैदा कर रही है लगता है कि हेक्स डंप में एक फर्क है, मैं पिछली बार याद किया:

//the first assembly 
TypeSpeC#1 (1b000001) 
------------------------------------------------------- 
    TypeSpec : Ptr Void 
    Signature: 0f 01 

//the second assembly 
TypeSpeC#1 (1b000001) 
------------------------------------------------------- 
    TypeSpec : I2 
    Signature: 06 

तो वहाँ ILDASM हेक्स में सिर्फ एक बग है गलत सदस्य हस्ताक्षर की रिपोर्ट डंप करें (हालांकि मुझे आश्चर्य है कि गलत हस्ताक्षर में 06 कहां से आया था)।

+0

स्पष्ट प्रश्न पूछने के लिए: आपको क्या लगता है कि यह '06 20 0f 01 08' होना चाहिए? क्या उसमें कोई ब्रेकडाउन/संदर्भ है? –

+0

@Marc मैंने सीएलआई के ईसीएमए में देखा है। मॉडॉप्टी का तत्व प्रकार '20' है, पॉइंटर का तत्व प्रकार' 0f' है, शून्य के अनुसार यह '01' है। तो, इन सभी को एक साथ उठाना, 'मोडोपेट (शून्य *)' का हस्ताक्षर '20 0f 01' होना चाहिए (' 06' फ़ील्ड कॉलकॉन और '08' int32 है)। – IllidanS4

+0

यह सी # है? मैं शून्य * देखता हूँ! – niceman

उत्तर

1

चलिए the specification पर आधारित क्षेत्र हस्ताक्षर मैन्युअल रूप से बनाने का प्रयास करते हैं। शुरू करने के लिए, §II.23.2.4 में फ़ील्ड हस्ताक्षर परिभाषित किया गया है। एक कस्टम संशोधक के साथ हमारे मामले के लिए, यह हो जाएगा:

FIELD CustomMod Type 

FIELD के बाद से 0x06 के रूप में परिभाषित किया गया है, हमने:

06 CustomMod Type 

हमारे कस्टम संशोधक modopt है, इसलिए हम मिल (§II के आधार पर .23.2.7):

06 CMOD_OPT TypeDefOrRefOrSpecEncoded Type 

CMOD_OPT 0x20 (§II.23.1.16) है:

06 20 TypeDefOrRefOrSpecEncoded Type 

हम संदर्भ के लिए TypeSpec 0x1b000001 है, जो के रूप में 0b110 इनकोडिंग (TypeSpec के लिए 10, 1 0x000001 के लिए, §II.23.2.8) चाहते हैं। यह तो "संकुचित" एकल बाइट 0x06 (§II.23.2) में है:

06 20 06 Type 

अंत में, प्रकार int32 है, जो ELEMENT_TYPE_I4 = 0x08 (§II.23.2.12 और §II.23.1 है। 16):

06 20 06 08 

तो हम ILDasm में दिखाए गए एक जैसा ही हस्ताक्षर प्राप्त करते हैं।

+0

धन्यवाद, यह और अधिक समझ में आता है। मैंने सोचा कि इसे टाइप हस्ताक्षर माना जाना चाहिए, टोकन टाइप न करें, इसलिए मैंने आईएलडीएएमएस के परिणामों की गलत व्याख्या की। – IllidanS4

संबंधित मुद्दे