wix 安装程序平台依赖问题

Posted

技术标签:

【中文标题】wix 安装程序平台依赖问题【英文标题】:wix installer platform dependency issues 【发布时间】:2014-05-22 06:45:06 【问题描述】:

我正在尝试为 x86 和 x64 创建一个安装程序(一个 MSI 文件)。我希望安装过程只安装基于目标机器平台的相关文件。 到目前为止,我只有一个适用于 x86 的 MSI,它按预期工作。 现在我添加了这个部分:

   <!-- Details to support both x86 and x64 platforms-->
  <?if $(var.Platform) = x64 ?>
  <?define ProductName = "MyApp (64 bit)" ?>
  <?define Win64 = "yes" ?>
  <?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
  <?define ExportReleaseComponentGroup  = "Export64ReleaseComponentGroup" ?>
  <?define MyApplication  = "$(var.x64SourcePath)\MyApp.exe" ?>
  <?else ?>
  <?define ProductName = "MyApp" ?>
  <?define Win64 = "no" ?>
  <?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
  <?define ExportReleaseComponentGroup  = "Export32ReleaseComponentGroup" ?>
  <?define MyApplication  = "$(var.win32SourcePath)\MyApp.exe" ?>
  <?endif ?>

现在我遇到了一些错误:

    在 x64 机器中,它安装在 Program Files (x86) 文件夹下。我正在 x86 中编译 SetupProject,这可能是原因吗?相关代码:

    <Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="$(var.PlatformProgramFilesFolder)">
    

    安装结束时应用程序不运行。相关代码:

    <!--CA to launch the exe after install-->
    <Property Id="WixShellExecTarget" Value="$(var.MyApplication)" />
    <CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />
    

    未创建桌面快捷方式和开始菜单快捷方式。相关代码:

    <Component Id="ProgramFilesShortcut" Guid="My-Guid">
        <Condition>MY_DESKTOP_SHORTCUT</Condition>
        <Shortcut Id="desktopMyApp" Directory="DesktopFolder" Name="MyApp" Target="$(var.MyApplication)" WorkingDirectory="bin" Icon="MyIcon.ico">
        </Shortcut>
        <RemoveFolder Id="ProgramFilesShortcut" On="uninstall" />
        <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Name="installed" Type="integer" Value="1" KeyPath="yes" />
    </Component>
    
    <Component Id="ProgramMenuDir" Guid="My-Guid">
        <Shortcut Id="startmenuMyApp" Directory="ProgramMenuFolder" Name="MyApp" Target="$(var.MyApplication)" Icon="MyIcon.ico" WorkingDirectory="bin" Arguments="-s">
    <!-- Set the AppID in order to get toasts to work -->
        <ShortcutProperty Key="System.AppUserModel.ID" Value="MyCompany.MyApp" />
        </Shortcut>
        <RemoveFolder Id="ProgramMenuDir" On="uninstall" />
        <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Name="installed" Type="integer" Value="1" KeyPath="yes" />
    </Component>
    

知道我做错了什么吗?

【问题讨论】:

【参考方案1】:

您正在使用编译时变量,因此您正在为 32 位或 64 位安装生成 MSI。 MSI 程序包必须以其中一个为目标。在某些情况下,这并不重要,但设计是将重要的组件放在正确的位置。

可以在单独的 32 位和 64 位版本之间共享源代码。

拥有两个 MSI 后,您可以使用 WiX Bootstrapper 项目将它们捆绑并在目标系统上安装相应的一个。

【讨论】:

以上是关于wix 安装程序平台依赖问题的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Wix Burn 安装程序包含完整的 .NET 先决条件

如何为 Wix 刻录引导程序 exepackage 添加依赖文件夹

在 WiX 中重新启动后继续安装

恢复到以前版本的 wix 安装程序

在 Window 安装程序 XML 中使用 Bootstrapper 制作单个 Bundle 项目

从 Visual Studio 过渡到 Wix 安装程序