У меня есть веб-служба, которая выдает исключение 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›. Однако при запуске веб-службы у меня по-прежнему появляется следующая страница:
Не удалось загрузить файл или сборку «Соединение» или одну из его зависимостей. Была сделана попытка загрузить программу с неверным форматом.