BadImageFormatException с .NET ILMerged DLL в Windows 7 64 - PullRequest
2 голосов
/ 19 июля 2010

Я разрабатываю в Windows 7 64-bit с 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 только при сборке в режиме выпуска.

Ответы [ 2 ]

2 голосов
/ 19 июля 2010

Я заставил это работать, и я думаю, что это было сделано из двух вещей:

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

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

0 голосов
/ 19 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...