발전기를 확장하는 특정 경우에 잘못된 출력을 생성하는 컴파일러에서 작업 중입니다. PEVerify는 이유에 대해 설명하지 않고 단순히 "유형로드에 실패했습니다"라고 말합니다. 과거에 이것을 보았을 때 일반적으로 생성 된 유형의 수가 제네릭 매개 변수 개수가 잘못 되었기 때문에 발생했습니다. 그러나 모든 것이 여기에 일치하는 것 같습니다.PEVerify에서 "유형로드 실패"진단 방법
생성 된 유형에 어떤 문제가 있었는지에 대한 자세한 정보를 얻을 수있는 좋은 방법이 있습니까? 그 오류를 추적하는 방법에 대한 유용한 팁과 기술이 있습니까? PEVerify에서
출력 : ILDASM에서
C:\Build\Test>peverify testcase.exe /VERBOSE /UNIQUE
Microsoft (R) .NET Framework PE Verifier. Version 4.0.30319.0 Copyright (c) Microsoft Corporation. All rights reserved.
[IL]: Error: [C:\Build\Test\testcase.exe : Testing.Linq_operatorModule::IndexWhereImpl[T]][mdToken=0x6000002][offset 0x00000002] Unable to resolve token.
[IL]: Error: [C:\Build\Test\testcase.exe : Testing.Linq_operatorModule+$IndexWhereImpl$3`1[T]::.ctor][mdToken=0x6000006] [HRESULT 0 x8007000B] - An attempt was made to load a program with an incorrect format.
[token 0x02000004] Type load failed.
3 Error(s) Verifying testcase.exe
종합 덤프 그것이 SO 게시물에 넣어 너무 큰 것에 따라, here입니다.
저는 CCI로 코드를 생성합니다. CCI를 사용하면 행복하게 완전히 우스꽝스럽게 무효 인 IL을 생성 할 수 있습니다 ... 그러나 Reflection.Emit와는 달리 * 실제로 타입 문제를 질식시키고 블랙 박스를 제공하지 않습니다. ILDasm과 PEVerify를 실행하여 오류의 원인을 찾아 낼 방법이없는 오류. –
감사합니다. 제네릭 형식 바인딩을 살펴 보겠습니다. 그것은 실제로 의미가 있습니다. 컴파일러는 제네릭 메소드를 생성기로 변환하고 메소드 locals를 생성기 클래스의 필드로 들어 올리므로 원래 메소드에서 제네릭 유형 매개 변수를 사용하는 것으로 식별됩니다. 그 문제를 해결할 시간. –
좋습니다. 허용 된 것으로 표시합니다. –