升级到64位版本时,将应用程序从“ Program Files x86”移动到“ Program Files”

时间:2019-05-24 15:34:19

标签: wix windows-installer

应用最初以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设置为<RemoveExistingProducts After="InstallInitialize" />

2 个答案:

答案 0 :(得分:2)

总体 :首先出现几个问题:

  • 并排 :您确定不希望支持32位和64位版本的并行安装吗? <Component Win64="yes" />
    • 有时这是可能的-作为向最新版本的过渡。您可以允许同时(或者永久)同时安装两个版本。
    • 这取决于您的软件包安装了多少数据,这些数据是“纠缠的”(在计算机上全局注册的,因此会干扰软件包之间)。
    • Here is an answer with a section on side-by-side issues(朝下)。不多,但对此事进行了一些讨论。
  • 先生。 Hester :我会读这个老化的文章,但是不错的博客:Different Packages are Required for Different Processor Architectures

实践中的误解 :我很生锈,所以请耐心等待,但是我会

  1. 完全为新的64位软件包设置新的安装位置,
  2. 最好更改产品名称,
  3. 更改所有组件的GUID(在您移动安装位置explanation here时必须)-use WiX auto-GUIDs,如果可以,
  4. 将所有64位组件标记为64位,其余部分保留为32位(显然: {{1}} ),
  5. 将该程序包标记为64位,
  6. 更改输出文件名以指示64位程序包,
  7. 我可能会将新的升级代码设置为新版本,但是这需要对升级表进行更高级的处理,以方便32位版本的卸载。通常,需要新的升级代码来支持并行安装。有许多小细节...例如:WiX heat.exe does not support 64-bit COM registration data extraction

一些问题

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

链接

答案 1 :(得分:1)

此处对此进行了讨论:

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

基本上,我的第一句话是,即使您安装了32位,.NET应用程序也可以运行64位。

我的第二点评论是,我不相信MSI支持进行重大升级和更改位。但这不是可以预见的用例(例如x86-> arm或x64-> itanium)。我相信您必须拥有一个烧录引导程序,该程序可以删除捆绑的32位MSI并安装64位MSI。

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

要考虑的另一件事是,某些产品可以同时安装32位和64位版本。最好的例子是C ++运行时重做器。设计允许并排安装,然后将其放在用户身上以删除旧的,这也许是可以接受的。