Избежание исключения BadImageFormatException при наличии неуправляемого кода - PullRequest
3 голосов
/ 10 мая 2011

У меня есть веб-сервис, который выдает исключение BadImageFormatException каждый раз, когда я пытаюсь запустить сервис из Visual Studio. Этот ответ на другой вопрос предложил запустить peverify для DLL-файлов, чтобы увидеть, есть ли какие-либо проблемы.Хотя DLL моей веб-службы в порядке, веб-служба зависит от сборки ILMerged, в которой есть ошибки:

[IL]: ошибка: [C: \ blah \ MyILMergedAssembly.dll: шифрование

Utils.SecureStringExtensions :: SecureEquals] [смещение 0x00000055] [найден неуправляемый указатель] [ожидается неуправляемый указатель] Неожиданный тип в стеке.

[IL]: ошибка: [C: \ blah \ MyILMergedAssembly.dll: шифрование

Utils.SecureStringExtensions :: SecureEquals] [смещение 0x0000005D] [найден неуправляемый указатель] [ожидается неуправляемый указатель] Неожиданный тип в стеке.

[IL]: ошибка: [C: \ blah \ MyILMergedAssembly.dll: Шифрование

Utils.SecureStringExtensions :: SecureEquals] [offset 0x0000007E] Неуправляемые указатели не являются проверяемым типом.

3 Проверка ошибок. \ MyILMergedAssembly..dll

(188 предупреждений)

Я думаю, это связано с моим использованием Marshal и IntPtr в MyILMergedAssembly, но везде, где я это делаю, у меня объявлен методкак unsafe.Как я могу избавиться от ошибок, которые дает peverify, и, надеюсь, избавиться от BadImageFormatException, который появляется, когда я пытаюсь запустить свой веб-сервис?

Edit: похоже, что я могуне используйте ILMerge для объединения сборок с небезопасным кодом.Поэтому я попытался, чтобы мой веб-сервис ссылался на все отдельные библиотеки DLL в MyILMergedAssembly, но я все еще получаю исключение BadImageFormatException.Теперь это дает мне исключение на одном из отдельных собраний.Когда я запускаю peverify для этой отдельной сборки, я получаю:

[IL]: ошибка: [C: \ blah \ Connection.dll: соединение

.ConnectionBase ::. Ctor] [HRESULT 0x80070002] - Системе не удается найти указанный файл.

Класс ConnectionBase, на который он ссылается, находится прямо в Connection.dll, или, по крайней мере, так должно быть, поскольку классопределяется в пространстве имен / проекте Connection.Соединение имеет «Разрешить небезопасный код», отмеченный в параметрах сборки.Конструктор в ConnectionBase, на который он может ссылаться, помечен как internal.

Редактировать: Я пытался проверить «Разрешить небезопасный код» в проекте веб-службы, который используетDLL с небезопасным кодом.Я также попытался добавить compilerOptions="/unsafe" в файл Web.config для веб-службы в узле system.codedom> compilers> compiler.Я по-прежнему получаю страницу со следующими сведениями при запуске веб-службы:

Не удалось загрузить файл или сборку «Соединение» или одну из ее зависимостей.Была предпринята попытка загрузить программу с неверным форматом.

1 Ответ

1 голос
/ 10 мая 2011

О, чувак, это раздражает. Это был небезопасный код, это были не 32/64-битные настройки целевой платформы в моих проектах в VS, это не ILMerge. Мне пришлось установить для параметра «Включить 32-разрядные приложения» значение «Истина» в пуле приложений в IIS 7 (в Windows 7 64-разрядная версия). После перезапуска пула приложений мой веб-сервис загружается нормально. Спасибо этому блогу за то, что отправили меня в правильном направлении.

...