에서 동일한 서명을해야합니다. 그 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
이 왔는지 궁금합니다.).
'06 20 0f 01 08'이라고 생각하는 이유는 무엇입니까? 그 고장/참조가 있습니까? –
@Marc CLI의 ECMA를 살펴 보았습니다. modopt의 원소 타입은'20'이고, 포인터의 원소 타입은'0f'이며, void 타입은'01'입니다. 그래서이 모든 것들을 모으기 위해서'modopt (void *) '의 서명은'20 0f 01' ('06'은 callconv이고'08'은 int32)이어야합니다. – IllidanS4
이 C#입니까? 나는 void *를 본다! – niceman