Несовместимость между x86 и x64 в решении для установки

У меня есть решение для установки, в котором есть проект установщика (не веб-установщик, а простой установщик), который устанавливает службы NT, веб-службы и веб-сайты с помощью дополнительных двух проектов DLL с моим собственным кодом, который выполняет мой этап установки. В действиях пользователя проекта установщика я вызываю функцию установщика одного из этих проектов, и этот проект вызывает установщик второго проекта: установщик -> MiddleCaller -> InstallationCore.

Все это разрабатывается в Windows 7 и отлично работает, когда я компилирую все в 32-битной версии.

Проект должен работать в Windows 2008. По некоторым причинам все должно быть в 64-битной версии.
Для этого в MiddleCaller и InstallationCore я щелкаю правой кнопкой мыши по проекту -> build -> targer x64. Чтобы переместить проект установщика на 64-битный, в свойствах установщика (когда проект активен) я проверяю: Целевая платформа: x64.

Когда я запускаю установку на x86, я получаю ошибку:

The installation package is not supported by this processor type"

И это хорошо, потому что теперь я знаю, что моя установка скомпилирована в 64-битной версии, но когда я запускаю ее в Windows 2008, я получаю:

Error 1001. Exception occured while initializing the instance:  
System.BadImageFormatException: could not load file or Assembly   
'MiddleCaller, v...' or one of its dependencies. An attempt was  
made to load a program with an incorrect format.  

Кто-нибудь знает, что мне нужно сделать, чтобы нормально запустить установку на x64?
Может быть, я все еще не переместил проект установщика на x64 bit, если да, где я это делаю?

Спасибо, что забегали вперед.


person rodnower    schedule 07.04.2010    source источник


Ответы (3)


Нашел на веб-сайте Microsoft совет, который может быть полезен при устранении неполадок в проектах установки и развертывания :

64-разрядные управляемые настраиваемые действия вызывают исключение System.BadImageFormatException

Если вы добавляете 64-разрядное управляемое настраиваемое действие в проект установки, процесс сборки Visual Studio встраивает 32-разрядную версию InstallUtilLib.dll в MSI как InstallUtil. В свою очередь, 32-разрядная платформа .NET Framework загружается для выполнения 64-разрядного управляемого настраиваемого действия и вызывает исключение BadImageFormatException.

В качестве временного решения замените 32-разрядную InstallUtilLib.dll на 64-разрядную версию.

Откройте полученный .msi-файл в Orca из пакета SDK для установщика Windows.

Выберите двоичную таблицу.

Дважды щелкните ячейку [Двоичные данные] для записи InstallUtil.

Убедитесь, что выбран параметр «Читать двоичный файл из файла», и нажмите кнопку «Обзор».

Перейдите к% WINDIR% \ Microsoft.NET \ Framework64 \ v2.0.50727.

Примечание. Каталог Framework64 устанавливается только на 64-битных платформах и соответствует типу 64-битного процессора. Выберите InstallUtilLib.dll.

Нажмите кнопку "Открыть".

Щелкните кнопку ОК.

person Eric Stassen    schedule 28.10.2011

В этом сценарии есть некоторые непонятные моменты. Я понимаю, что у вас возникли проблемы с запуском 32-разрядной программы установки, которая вызывает 64-разрядные сборки. Если это правильно, то то, что вы делаете, запрещено. У вас не может быть 32-битных и 64-битных сборок в одном процессе - это незаконно. Если установщик напрямую ссылается на 64-разрядные сборки, то установщик также должен быть 64-разрядным.

В качестве пояснения: я считаю, что 32-разрядный установщик может установить 64-разрядное приложение, но он может сделать это только путем копирования 64-разрядных файлов, а не путем фактического обращения к 64-разрядным файлам. Единственный способ, которым это поддерживается, - это если 64-битные файлы загружаются в другой процесс и вы используете IPC для их вызова, но даже это, вероятно, будет плохим решением.

В вашем случае я бы посоветовал вам преобразовать ваш установщик в 64-битный установщик.

person Jaxidian    schedule 07.04.2010
comment
Все возможные вещи в 64 бит. Также проекты устанавливаемого приложения, а также устанавливаемого приложения. Я не уверен, что запустил 32-битный установщик после того, как изменил указанное выше свойство на x64 bit ... Если да, то знаете ли вы, как сделать установщик 64-битным? И да, я все еще копирую dll, я использую Project Output только для двух инсталляционных проектов, которые являются частью установочного пакета. - person rodnower; 07.04.2010

Итак, в конце концов, я скомпилировал MiddleCaller и InstallationCore в режиме AnyCpu, когда все DLL и исполняемые файлы, которые мне нужно установить, были скомпилированы в x64 бит. Все это я скомпилировал в Windows 2008 x64 bit с 64-битными внешними зависимостями (например, клиент Oracle).

person rodnower    schedule 02.05.2010