Несовместимость между x86 и x64 в решении установки - PullRequest
2 голосов
/ 07 апреля 2010

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

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

Проект должен работать в Windows 2008. По некоторым причинам все должно быть в x64 бит.
Для этого в 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 бит, если да, то где я это делаю?

Спасибо за внимание.

Ответы [ 3 ]

4 голосов
/ 29 октября 2011

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

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

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

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

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

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

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

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

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

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

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

Нажмите кнопку ОК.

0 голосов
/ 02 мая 2010

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

0 голосов
/ 07 апреля 2010

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

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

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

...