【问题标题】:32 and 64 bit assemblies in one windows installer一个 Windows 安装程序中的 32 位和 64 位程序集
【发布时间】:2010-04-28 20:32:59
【问题描述】:

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

问题是,在创建安装程序时,我无法将 64 位模式 dll 添加到安装项目,因为我收到以下错误:File '' targeting '' is not compatible with the project's target platform ''.

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

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

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

有什么建议吗?

【问题讨论】:

    标签: .net installation 64-bit windows-installer custom-action


    【解决方案1】:

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

    检查此脚本位于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;
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        因此,在构建时,您构建 32 位版本,将其打包,而 64 位被忽略,然后您对 64 位执行相同操作。如果需要,您可以通过命令行参数传递这些标志。

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-01
            • 2015-02-21
            • 1970-01-01
            • 1970-01-01
            • 2011-02-06
            相关资源
            最近更新 更多