Вопрос

Я разрабатываю в 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 когда я создаю в режиме выпуска.

Это было полезно?

Решение

У меня получилось, и я думаю, что это произошло благодаря двум вещам:

  1. MyMergedDLL была собрана с использованием пары других сборок, которые я контролирую, но эти сборки не были настроены на x86.Я перестроил эти сборки, ориентированные на x86, перестроил сборки, составляющие MyMergedDLL, и повторно объединил эти сборки, чтобы сформировать новую копию MyMergedDLL.
  2. Консольное приложение, использующее MyMergedDLL, было настроено на x86 в режиме отладки, но не в режиме выпуска, следовательно, почему оно будет работать в режиме отладки, но выдавать BadImageFormatException в режиме выпуска.

В первом, возможно, и не было необходимости.Я думаю, мне просто нужно было, чтобы потребитель MyMergedDLL также ориентировался на x86 в режиме выпуска.Я так и не смог понять, какую версию ILMerge я использовал, поэтому я просто переустановил ее с последней версией MSI, которую смог найти на сайте Microsoft.

Другие советы

Вы перепроверили версию ILMerge, которую используете?

Я спрашиваю, потому что старая, некорректная версия aspnet_merge (которая в основном выполняет то же самое слияние библиотек dll среди прочего) вызвала у нас те же проблемы, которые вы описываете.Отвечая, я вдавался в некоторые подробности этот вопрос для кого-то еще по SO.

Возможно, стоит бегло взглянуть на библиотеку dll в ILDASM (Reflector имеет тенденцию падать при попытке декомпилировать эти плохие библиотеки dll - возможно, неудивительно) и посмотреть, сможете ли вы определить точку повреждения и чему это соответствует в вашем коде, поскольку это может пролить свет на проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top