6

我有一个用 C# 编写的应用程序,它依赖于 sqlite 托管提供程序。sqlite 提供程序依赖于平台(有两个同名的 32 位和 64 位应用程序的 dll)。应用程序根据操作系统在运行时加载所需的。

问题是,在创建安装程序时,我无法将 64 位模式 dll 添加到安装项目,因为我收到以下错误:文件“目标”与项目的目标平台“不兼容”。

我会使用其他安装程序,但我有一个必须在设置期间调用的自定义操作。

所以我想知道是否有一个安装程序可以让我添加 32 位和 64 位 dll 并执行用 C# 编写的自定义操作。

一种可能的解决方案是有两个安装程序,但如果可能的话,我想避免它。

有什么建议么?

4

4 回答 4

6

Inno Setup Installer 支持您要求的功能,该安装程序非常灵活和可靠,在 Web 中存在许多脚本示例,可以根据最终客户端的体系结构进行有条件的安装。

检查此脚本位于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;
于 2010-04-28T20:47:21.623 回答
1

使用 Windows 安装程序,没有。你需要两个设置。

然而, NSIS非常有能力通过运行时检测在单个设置中处理这两个平台。这真的取决于您是否针对企业用户,企业客户将需要 Windows Installer (MSI) 软件包,而您的普通互联网用户并不关心:)

于 2010-04-29T00:14:28.130 回答
1

我喜欢 Inno 设置的想法,我可能会尝试一下,但请考虑以下几点:

Microsoft MSI 最佳实践是有 2 个单独的设置,一个用于 32 和一个用于 64,并且像 Installshield 这样的许多第 3 方 IDE 都支持这些最佳实践。IMO 这可能是有原因的,否则他们会添加此功能以比竞争对手更具优势。

要从单个设置项目构建 2 个设置,您将拥有从同一个设置项目构建的两个安装程序,使用发布标志,您基本上创建一个包含 32 位程序集的功能,另一个包含 64 位程序集的功能,分配一个发布标志他们每个人,并分别构建每个版本,

所以在构建时,你构建 32 位版本,它被打包,而 64 位被忽略,然后你对 64 位做同样的事情。如果需要,您可以通过命令行参数传递这些标志。

这样您就无需维护重复的设置代码。

于 2010-04-29T00:25:08.783 回答
1

Windows 安装程序在这种情况下工作正常,例如有两个组件,每个组件都有一个 sqlite 文件,并根据 VersionNT64 属性有条件地安装一个或另一个,该属性仅在安装运行在 64 位平台上时设置。

于 2013-07-31T10:01:24.283 回答