2010-04-28 86 views
6

我有一个用C#编写的应用程序,它依赖于sqlite托管提供程序。 sqlite提供程序是依赖于平台的(对于32位和64位应用程序,有两个同名的dll)。应用程序在运行时基于OS加载所需的一个。在一个Windows安装程序中的32位和64位程序集

的问题是,虽然创建一个安装程序我不能添加64位模式下的dll到安装项目,因为我收到以下错误:File '' targeting '' is not compatible with the project's target platform ''.

我会用其他的安装程序,但我必须为自定义操作在安装过程中调用。

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

一个可能的解决方案是有两个安装程序,但我希望尽可能避免它。

有什么建议吗?

回答

6

Inno Setup安装程序支持您请求的功能,该安装程序非常灵活可靠,在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; 
1

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

但是,NSIS能够在运行时检测的单个设置中处理两个平台。这真的取决于如果你的目标企业用户与否,企业客户将需要Windows Installer(MSI)的软件包,而一般的互联网用户并不关心:)

1

我喜欢创新安装的想法,我可能会放弃它是一个尝试,但考虑以下几点:

微软MSI最佳实践是有2个独立的设置,一个为32和一个为64,许多第三方IDE像Installshield支持这些最佳实践。国际海事组织可能有这个原因,否则他们会增加这个功能来超越竞争对手。

要从单个安装项目创建2个安装程序,您必须使用同一个安装项目构建两个安装程序,使用发行标志,基本上创建一个包含32位程序集的功能,另一个包含64位程序集,一个发布标志,并分别构建每个版本,

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

这样你就没有重复的设置代码来维护。

1

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

相关问题