Я работаю над компилятором, который производит плохие результаты в некоторых случаях расширения генераторов. 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, чтобы выяснить, что происходит не так. –
Итак, спасибо. Я рассмотрю типичные привязки типов. Это действительно имеет смысл. Компилятор преобразует общий метод в генератор и локализует его в поля класса генератора, а это означает, что они все еще идентифицируются как используемые параметры типового типа из исходного метода. Время работать над исправлением этого. –
Хорошо, это сработало. Маркировка как принято. –