2015-01-06 2 views
7

에서 동일한 서명을해야합니다. 그 ILDASM 보고서 (16 진수로 표시)이 같은 모두 해당 필드는다른 유형이 같은 CIL에 정의 된 하나 개의 필드가 CIL

.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! 내가 여기서 무엇을 놓치고 있니?

편집 :

C#을 사용자 정의 유형 수정을 지원하지 포인터와 배열 유형에 대해 예외를 던지고, 필드의이 유형을 방출 할 수없는, 그래서 이것은 분명히 서명 불일치를 해결합니다. 그러나 ILDASM이 디 컴파일 할 수없는 잘못된 서명을 만들 수있는 이유는 여전히 남아 있습니다.

편집 # 2 :

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

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

그래서 ILDASM 헥스 단지 버그가 :

내가 마지막 시간을 놓친 헥스 덤프에 차이가, ILASM 실제로 올바른 IL를 만드는 것 잘못된 멤버 서명을보고하는 덤프 (비록 내가 잘못된 서명의 어디에서 06이 왔는지 궁금합니다.).

+0

'06 20 0f 01 08'이라고 생각하는 이유는 무엇입니까? 그 고장/참조가 있습니까? –

+0

@Marc CLI의 ECMA를 살펴 보았습니다. modopt의 원소 타입은'20'이고, 포인터의 원소 타입은'0f'이며, void 타입은'01'입니다. 그래서이 모든 것들을 모으기 위해서'modopt (void *) '의 서명은'20 0f 01' ('06'은 callconv이고'08'은 int32)이어야합니다. – IllidanS4

+0

이 C#입니까? 나는 void *를 본다! – niceman

답변

1

the specification을 기반으로 수동으로 필드 서명을 만들어 보겠습니다. 시작하기 위해 필드 서명은 §II23.2.4에 정의되어 있습니다. 하나의 사용자 정의 수정과 우리의 경우, 그것은이 될 것입니다 : FIELD 이후

FIELD CustomMod Type 

이이 0x06으로 정의된다, 우리는이 :

06 CustomMod Type 

우리의 사용자 정의 수정이 modopt, 그래서 우리가 얻을 수 (§II에 따라 .23.2.7)

06 CMOD_OPT TypeDefOrRefOrSpecEncoded Type 

CMOD_OPT는)가 0x20 (§II.23.1.16이다

0,123,296

TypeSpec 0x1b000001은 0b110 (TypeSpec의 경우 10, 0x000001의 경우 §II.23.2.8의 경우 1)으로 인코딩됩니다. 이 후, 단일 바이트 0x06 임 (§II.23.2)로 "압축"이다

06 20 06 Type 

마지막 유형의 경우 0x08 = ELEMENT_TYPE_I4 (§II.23.2.12 및 §II.23.1 인 int32이다. 16) :

06 20 06 08 

따라서 ILDasm에 표시된 것과 정확히 동일한 서명을 얻습니다.

+0

감사합니다. 이것은 훨씬 더 의미가 있습니다. 형식 토큰이 아닌 형식 시그니처라고 생각했기 때문에 ILDasm의 결과를 잘못 해석했습니다. – IllidanS4

관련 문제