Как избежать исключения BadImageFormatException при наличии неуправляемого кода

У меня есть веб-служба, которая выдает исключение 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] [смещение 0x0000007E] Неуправляемые указатели не поддаются проверке.

3 Ошибка (и) проверки. \ MyILMergedAssembly.dll

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

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

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

[IL]: Ошибка: [C: \ blah \ Connection.dll: Подключение

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

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

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

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


person Sarah Vessels    schedule 10.05.2011    source источник


Ответы (1)


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

person Sarah Vessels    schedule 10.05.2011