Установщик, созданный проектом развертывания VS 2008, завершается с ошибкой "System.BadImageFormatException"
Я создал установщик с Visual Studio 2008. Тип проекта VS является проектом развертывания. Этот установщик не работает в некоторых средах, но также отлично работает в некоторых других средах.
Например, установщик скомпилирован на виртуальной машине под управлением Windows Server 2012 R2 Standard. Конечно, установка там удалась. Однако в другой виртуальной машине, работающей под управлением той же версии Windows, происходит сбой.
Сообщение об ошибке: "Ошибка 1001. Исключительная ситуация при инициализации установки: System.BadImageFormatException: Не удалось загрузить файл или сборку" файл: Custom actions.dll "или одну из ее зависимостей. Эта сборка создается средой выполнения, более новой, чем в настоящее время загружен и не может быть загружен. "
Целевая структура составляет 3,5 во всех приложениях в решении для установки. Также ссылки в библиотеке пользовательских действий имеют.NET версии 2.0 или 3.5.
Чего не хватает в провальной среде? С чего начать поиск?
2 ответа
Блог: Может быть, проверить этот блог быстро. По существу: 1) bitness 32/64
, 2) corrupted binary file
или же 3) configuration issues
(app.config
).
InstallUtilLib.dll: Вот аналогичный ответ: System.BadImageFormatException: Не удалось загрузить файл или сборку (из installutil.exe). Он ссылается на это объяснение MSDN: 64-разрядные управляемые настраиваемые действия генерируют исключение System.BadImageFormatException. Кажется вероятным.
Альтернативы: реальный ответ - ИМХО - будет избегать проектов установщика Visual Studio из-за ряда известных проблем с этим типом проекта. Инструментарий WiX является хорошей альтернативой с открытым исходным кодом. И есть другие, коммерческие варианты. И есть альтернативная версия с более сложными деталями.
Некоторые ссылки:
На самом деле есть только две причины этой ошибки:
У вас есть 32-битный (или 64-битный) код, пытающийся вызвать сборку противоположной архитектуры. В вызовах пользовательских действий вам нужно будет выследить последовательность вызовов и быть осторожным с типами сборок AnyCpu, которые могут быть JIT-скомпилированы для архитектуры системы, а не для сборок, которые вы будете вызывать.
Несовместимые NET архитектуры. В вашем случае все упомянутые вами сборки основаны на NET 2.0 CLR. Если они в конечном итоге работают в NET 4.0 CLR, они потерпят неудачу. Это может помочь посмотреть на условия запуска, чтобы увидеть, что происходит.
Я также думаю, что Visual Studio 2008 не является хорошей основой для проекта установки. VS Community Edition является бесплатным, и будет размещать надстройку Projects. Конечно, VS 2008 не знает о NET 4.0 CLR.