【问题标题】:Move application from "Program Files x86" to "Program Files" when upgrading to 64 bit version升级到 64 位版本时将应用程序从“Program Files x86”移动到“Program Files”
【发布时间】:2019-05-24 15:34:18
【问题描述】:

应用最初以 32 位形式交付。现在发布了 32 位和 64 位版本。

现在,当 64 位 Windows 用户将应用程序从 32 位版本升级到 64 位版本时,默认安装文件夹应指向“程序文件”(无 x86)。

我已经以这种方式更新了我的wsx 文件:

    <?if $(var.Platform) = x64 ?>
        <?define bitness = "(64 bit)" ?>
        <?define Win64 = "yes" ?>
        <?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
    <?else ?>
        <?define bitness = "(32 bit)" ?>
        <?define Win64 = "no" ?>
        <?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
    <?endif ?>
      ....
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="$(var.PlatformProgramFilesFolder)">
                <Directory Name="COMPANY" Id="D.COMPANY">
                    <Directory Name="Product name" Id="APPDIR">

                    </Directory>
                </Directory>
            </Directory>
        </Directory>

这非常适合全新安装:
在 64 位系统上安装 32 位应用程序时,它安装在“程序文件 x86”中,在所有其他情况下,安装到“程序文件”中。

如果从 32 位升级到 64 位,默认目标文件夹仍然是“Program files x86”,如果将其移至“Program files”,我喜欢这样。

有什么好的方法吗?还是我必须在我的 C++ 代码中覆盖这个自定义操作?

编辑/更新
只是要清楚。我的应用程序是后台服务。机器用户根本看不到该应用程序(极端极端情况除外)。在大多数情况下,此服务由其他可以静默远程安装所需软件的服务安装/取消分级。

在此升级期间,所有 32 位组件都将被清除(一个 exe 和几个 dll-s)并替换为 64 位等效组件。配置数据和缓存数据被传输到升级后的应用程序。

RemoveExistingProducts 设置为&lt;RemoveExistingProducts After="InstallInitialize" /&gt;

【问题讨论】:

  • RemoveExistingProducts 是如何安排的?我对这些位/迁移问题生疏了。好的,现在我看到您将提供两个版本 - 最初我读到您希望完全迁移到 64 位。您是否考虑过并排安装?我将在下面取消删除我有些相关的答案,以便您快速查看。

标签: wix windows-installer


【解决方案1】:

总体:首先有几个问题:

  • Side-By-Side:您确定不支持 32 位和 64 位版本的并行安装吗? Different packages with different installation locations (and some shared components)
    • 这有时是可能的 - 作为向最新版本的过渡。您可以允许同时安装两个版本一段时间(或永久)。
    • 这取决于您的软件包安装了多少“纠缠”数据(在计算机上全局注册,因此会在软件包之间产生干扰)。
    • Here is an answer with a section on side-by-side issues(朝向底部)。不多,就这个问题稍微讨论一下。
  • 先生。斯图尔特:我会阅读这个老化但很好的博客:Different Packages are Required for Different Processor Architectures

实用小技巧:我生疏了,请耐心等待,但我愿意

  1. 完全为您的新 64 位软件包设置新的安装位置,
  2. 最好更改产品名称,
  3. 更改所有组件 GUID(移动安装位置时需要,explanation here) - use WiX auto-GUIDs,如果可以的话,
  4. 将所有 64 位组件标记为 64 位,将其余组件保留为 32 位(显然:&lt;Component Win64="yes" /&gt;),
  5. 将包标记为 64 位,
  6. 更改输出文件名以指示 64 位包,
  7. 我可能会为新版本设置一个新的升级代码,但这需要对升级表进行更高级的处理,以便于卸载 32 位版本。通常需要新的升级代码来支持并行安装。有很多小细节……例如:WiX heat.exe does not support 64-bit COM registration data extraction

一些问题

  • 您还有剩余的 32 位组件吗? (64-bit packages)。
  • 全局范围:任何 COM 组件?有司机吗?任何文件关联?
  • 存在位数问题的先决条件?

链接

【讨论】:

  • 是的,我确定它不能是并行应用程序。这是在后台运行的服务(没有用户交互),所以没有必要加倍这个服务。
  • Chris 提到从一个位迁移到另一个位可能会出现问题。我还没有尝试过,但是如果您提前卸载旧版本并将新版本安装到新位置,我认为应该可以。我没有测试过,在没有测试用例的情况下肯定地陈述任何事情总是很危险的。整个软件是否变成了 64 位
  • 报告了错误,因为此软件包是由某些业务管理工具远程静默安装的。所以卸载/安装对我来说不是一个有效的选择。
  • 您如何在 MSI 中对RemoveExistingProducts 进行测序?可以提前卸载旧版本(在InstallInitialize之后立即删除ExistingProducts),也就是说在安装新版本之前它已经完全消失了。
  • 我继承了这些东西(我更像是 MacOS iOS 开发者,被要求修复 Windows 上的东西)。无论如何,这个条目看起来像这样&lt;RemoveExistingProducts After="InstallInitialize" /&gt;
【解决方案2】:

这里有一个讨论:

Upgrading application and switching from 64-bit to 32-bit

基本上我的第一条评论是,如果您的 .NET 应用程序可以运行 64 位,即使您安装的是 32 位。

我的第二条评论是我不相信(请参阅其他线程中的 cmets)MSI 支持进行重大升级和更改位数。这不是一个可以预见的用例(例如 x86 -> arm 或 x64 -> itanium )。我相信你必须有一个烧录引导程序来处理删除 32 位 MSI 并安装 64 位 MSI 作为捆绑包的一部分。

对于创作 MSI,ProgramFiles64Folder 和 ProgramFilesFolder 是不同的目录,因此是不同的组件 ID GUIDS。

要考虑的另一件事是,某些产品可以同时安装 32 位和 64 位版本。一个典型的例子是 C++ 运行时 redists。也许设计允许并排安装并将其放在用户身上以移除旧的可能是可以接受的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多