升级应用时安装到相同路径

4
我正在开发一个应用程序,需要实现自动更新功能。我有一个 Web 服务,程序会检查该服务并下载和运行新的安装程序(使用 Visual Studio 2005 设置项目),之后程序会重新启动。一切都很顺利。
但是我该如何确保安装程序中的安装路径默认与用户最初安装程序时的路径相同呢?
例如,如果用户将其从“Program Files”更改为“C:\SomeFolder”,我该如何让安装程序检测到并将其安装路径更改为“C:\SomeFolder”,而不是“Program Files”?或者如果用户选择为“当前用户”而不是“所有用户”进行安装,又该怎么办呢?

2
如果用户选择仅为“当前用户”安装,则其他用户将不得不安装新副本,因为所有文件和注册表条目都进入用户的个人资料。这些设置对系统的其他用户不可见,与“所有用户”安装相反。 - Alexey Ivanov
1个回答

13

-右键单击安装程序项目
-查看
-注册表
-在左侧,展开HKey_Local_Machine和Software,然后单击制造商节点
-在右侧,右键单击并添加字符串注册表键
-命名注册表键为InstallDir
-将其值设置为[TARGETDIR]

enter image description here

安装程序完成后,您可以看到InstallDir regkey包含位置信息。您的升级程序也可以使用此路径。

enter image description here

通常,“只有我”和“所有人”之间唯一的区别是创建的快捷方式的位置。您可以在安装过程中运行Process Monitor并自行查看。

编辑:

使用以下步骤可以使用InstallDir RegistryKey进行更新程序应用。参考:如何:使用注册表启动条件指定目标目录

-右键单击Updater的安装程序项目
-查看
-启动条件
-添加搜索RegistryKey
-将属性指定为SEARCHFORINSTALLDIR
-将RegKey指定为SOFTWARE\ManufacturerName
-将root指向HKLM
-将值指定为InstallDir

enter image description here

-添加启动条件
-将条件指定为SEARCHFORINSTALLDIR
-保留InstallUrl和Message

enter image description here

-右键单击安装程序项目
-查看
-文件系统
-选择应用程序文件夹
-按F4查看应用程序文件夹的属性
-将DefaultLocation指定为[SEARCHFORINSTALLDIR]

在这里输入图片描述

现在,当你为更新程序构建安装包并运行它时,它将为你提供InstallDir注册表键的值,以便得到安装路径。

如果你希望禁用“文件夹文本框”和“浏览”按钮,以防止用户更改更新程序的安装路径,你可以使用Orca.exe。Orca 是一个数据库表格编辑器,可用于创建和编辑 Windows Installer 包和合并模块。然后只需按照这个设置项目,修复已安装套件的位置


你还可以按照 Aaron Stebner 的如何基于注册表值修改 MSI 安装程序中的默认安装路径进行操作。


那么当我运行MSI时,我需要将目标目录传递给它吗?例如Process.Start("Updater.msi", "TARGETDIR=" & InstallDir)?因为这是我自己想出来的解决方案,只不过我使用了应用程序的当前目录。使用注册表是更好的解决方案吗? - John
嗨@John,请检查我的编辑-最好比较一下差异并仔细检查您是否有""[TARGETDIR]\MyApp.exe"",因为现在只有[TARGETDIR]。 - Jeremy Thompson
哇...非常详细。谢谢! - John
如果注册表值为空或不存在怎么办?例如,第一次安装时没有“InstallDir”值,因此我希望“文件夹文本框”有一个默认位置。我该怎么做? - Doctor.Who.
你想要填写安装文件夹位置,但是你没有InstallDir注册表键吗?也许可以另找一种方法来查找Exe,这可能会有所帮助:https://dev59.com/al8d5IYBdhLWcg3wnzVz - Jeremy Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接