32- и 64-битные сборки в одном установщике Windows - PullRequest
6 голосов
/ 29 апреля 2010

У меня есть приложение, написанное на C #, которое зависит от управляемого поставщика sqlite. Поставщик sqlite зависит от платформы (есть два dll для 32- и 64-битных приложений с одинаковым именем). Приложение загружает нужный во время выполнения на основе ОС.

Проблема в том, что при создании установщика я не могу добавить dll в 64-битном режиме в проект установки, так как получаю следующую ошибку: Файл '' target '' не совместим с целевой платформой проекта ''.

Я бы использовал другой установщик, но у меня есть настраиваемое действие, которое должно быть вызвано во время установки.

Итак, я хотел узнать, есть ли установщик, который позволит мне добавить 32- и 64-битную DLL к нему и выполнить пользовательское действие, написанное на C #.

Одним из возможных решений является наличие двух инсталляторов, но я бы хотел избежать этого, если это возможно.

Есть предложения?

Ответы [ 4 ]

6 голосов
/ 29 апреля 2010

Установщик Inno поддерживает функцию, которую вы запрашиваете, этот установщик очень гибкий и надежный, в Интернете существует множество примеров сценариев для условной установки в зависимости от архитектуры конечного клиента.

Проверьте этот скрипт, расположенный в C:\Program Files\Inno Setup 5\Examples\64BitThreeArch.iss

 -- 64BitThreeArch.iss --
; Demonstrates how to install a program built for three different
; architectures (x86, x64, Itanium) using a single installer.

; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES!

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
Compression=lzma2
SolidCompression=yes
OutputDir=userdocs:Inno Setup Examples Output
; "ArchitecturesInstallIn64BitMode=x64 ia64" requests that the install
; be done in "64-bit mode" on x64 & Itanium, meaning it should use the
; native 64-bit Program Files directory and the 64-bit view of the
; registry. On all other architectures it will install in "32-bit mode".
ArchitecturesInstallIn64BitMode=x64 ia64

[Files]
; Install MyProg-x64.exe if running on x64, MyProg-IA64.exe if
; running on Itanium, MyProg.exe otherwise.
Source: "MyProg-x64.exe"; DestDir: "{app}"; DestName: "MyProg.exe"; Check: IsX64
Source: "MyProg-IA64.exe"; DestDir: "{app}"; DestName: "MyProg.exe"; Check: IsIA64
Source: "MyProg.exe"; DestDir: "{app}"; Check: IsOtherArch
Source: "MyProg.chm"; DestDir: "{app}"
Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"

[Code]
function IsX64: Boolean;
begin
  Result := Is64BitInstallMode and (ProcessorArchitecture = paX64);
end;

function IsIA64: Boolean;
begin
  Result := Is64BitInstallMode and (ProcessorArchitecture = paIA64);
end;

function IsOtherArch: Boolean;
begin
  Result := not IsX64 and not IsIA64;
end;
1 голос
/ 31 июля 2013

Установщик Windows работает нормально в этом сценарии, например иметь два компонента, каждый с одним из файлов sqlite, и условно установить один или другой на основе свойства VersionNT64, которое устанавливается только при выполнении установки на 64-разрядной платформе.

1 голос
/ 29 апреля 2010

Мне нравится идея установки Inno, я, вероятно, попробую, но учтите следующее:

Лучшая практика Microsoft MSI состоит в том, чтобы иметь 2 отдельные установки, одну для 32 и одну для 64, и многие сторонние IDE, такие как Installshield, поддерживают эти рекомендации. ИМО, вероятно, есть причины для этого, иначе они бы добавили эту функцию, чтобы иметь преимущество перед конкурентами.

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

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

Таким образом, у вас нет дублирующего кода установки для обслуживания.

1 голос
/ 29 апреля 2010

С установщиком Windows, нет. Вам понадобятся две настройки.

Однако NSIS вполне способен обрабатывать обе платформы в одной установке с обнаружением во время выполнения. Это действительно зависит от того, нацелены ли вы на корпоративных пользователей или нет, корпоративным клиентам потребуются пакеты Windows Installer (MSI), в то время как вашему обычному интернет-пользователю все равно:)

...