Исключение BadImageFormatException с .NET ILMerged DLL в Windows 7 64
-
17-09-2020 - |
Вопрос
Я разрабатываю в 64-разрядной версии Windows 7 с помощью Visual Studio 2008.У меня есть коллекция библиотек классов, которые я объединяю в одну библиотеку DLL, используя ILMerge.Однако, когда я пытаюсь использовать эту объединенную библиотеку DLL, я получаю
[Исключение BadImageFormatException:Не удалось загрузить файл или сборку 'MyMergedDll' или одну из ее зависимостей.Была предпринята попытка загрузить программу с неправильным форматом.]
Я искал помощь в этом вопросе, и мне показалось, что мне нужно установить свойство Build в каждом проекте в MyMergedDll на целевой x86, поэтому я это сделал.Я также настроил все проекты, отличные от MSTest, в веб-сервисе, в котором я ссылаюсь на MyMergedDll, на целевой x86.Однако я все еще получаю эту ошибку.
Если эта запись в блоге следует полагать, я могу получить эту ошибку в результате выполнения:
public class SpecificClass: BaseClass: where T : class { }
То есть наличие ограничения класса для универсального.Однако запись в блоге датирована 2007 годом, так что я не знаю, применимо ли это до сих пор.Я хотел получить некоторую информацию от StackOverflow о том, в чем, по вашему мнению, проблема, прежде чем я начну отслеживать каждый общий класс в своих проектах, чтобы проверить ограничения.
Если это имеет значение, MyMergedDll подписан строгим именем.Я пытаюсь использовать MyMergedDll как в консольном приложении, так и в веб-сервисе.Я не знаю, возможно, все усложняется из-за того, обновляется ли IIS каждый раз, когда я перестраиваю веб-службу.С помощью консольного приложения я, кажется, получаю только BadImageFormatException
когда я создаю в режиме выпуска.
Решение
У меня получилось, и я думаю, что это произошло благодаря двум вещам:
- MyMergedDLL была собрана с использованием пары других сборок, которые я контролирую, но эти сборки не были настроены на x86.Я перестроил эти сборки, ориентированные на x86, перестроил сборки, составляющие MyMergedDLL, и повторно объединил эти сборки, чтобы сформировать новую копию MyMergedDLL.
- Консольное приложение, использующее MyMergedDLL, было настроено на x86 в режиме отладки, но не в режиме выпуска, следовательно, почему оно будет работать в режиме отладки, но выдавать
BadImageFormatException
в режиме выпуска.
В первом, возможно, и не было необходимости.Я думаю, мне просто нужно было, чтобы потребитель MyMergedDLL также ориентировался на x86 в режиме выпуска.Я так и не смог понять, какую версию ILMerge я использовал, поэтому я просто переустановил ее с последней версией MSI, которую смог найти на сайте Microsoft.
Другие советы
Вы перепроверили версию ILMerge, которую используете?
Я спрашиваю, потому что старая, некорректная версия aspnet_merge (которая в основном выполняет то же самое слияние библиотек dll среди прочего) вызвала у нас те же проблемы, которые вы описываете.Отвечая, я вдавался в некоторые подробности этот вопрос для кого-то еще по SO.
Возможно, стоит бегло взглянуть на библиотеку dll в ILDASM (Reflector имеет тенденцию падать при попытке декомпилировать эти плохие библиотеки dll - возможно, неудивительно) и посмотреть, сможете ли вы определить точку повреждения и чему это соответствует в вашем коде, поскольку это может пролить свет на проблему.