应用最初以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" />
答案 0 :(得分:2)
总体 :首先出现几个问题:
<Component Win64="yes" />
?
实践中的误解 :我很生锈,所以请耐心等待,但是我会
一些问题 :
链接 :
答案 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 ++运行时重做器。设计允许并排安装,然后将其放在用户身上以删除旧的,这也许是可以接受的。