我正在研究一個在某些擴展生成器的情況下生成錯誤輸出的編譯器。 PEVerify只是說「類型加載失敗」,沒有給出任何解釋爲什麼。當我看到過去的時候,一般是因爲生成的類型的泛型參數數量錯了,但是這裏的一切似乎都匹配了。如何診斷「類型加載失敗」來自PEVerify
有沒有什麼好方法可以獲得關於生成類型出錯的更多詳細信息?除此之外,有沒有什麼好的技巧和技巧來找出錯誤?從PEVerify
輸出:
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
從ILDASM綜合轉儲here,因爲它太大,放在一個SO崗位。
我用CCI生成類似這樣的代碼,它將會愉快地生成完全可笑的IL ......但與Reflection.Emit不同,它將*實際生成它,*而不是窒息類型問題並給我一個黑盒子錯誤無法運行ILDasm和PEVerify來找出錯誤。 –
所以,謝謝。我會研究泛型類型的綁定。這實際上是有道理的。編譯器正在將泛型方法轉換爲生成器,並且將方法局部變量提升到生成器類的字段中,這意味着它們仍然被識別爲使用始發方法中的泛型類型參數。有時間來解決這個問題。 –
好的,工作。標記爲已接受。 –