我正试图解决这个问题一段时间了。我为我的Bootstrapper应用程序编写了一个自定义UI。为InstallFolder设置默认值不是问题,但是当用户更改此路径时,如何存储此路径以便以后添加/删除程序中的更改,例如,什么时候应该通过修改Bundle安装捆绑包中的另一个包? 在Registry中写入可能是一个选项,但Bootstrapper Application不会一直运行,因此无法写入HKLM。但应该有一种方法可以做到这一点,我在Visual Studio中看到了类似的东西......
答案 0 :(得分:0)
您应该将InstallFolder值存储在注册表中,并将其与引导程序应用程序一起打包的MSI存储在一个(或全部取决于它的创作方式)。在启动时,您可以使用util:RegistrySearch
在引导程序中查找并设置InstallFolder。
<Fragment>
<util:RegistrySearch
Id="ServerInstalledCheck"
Root="HKLM"
Key="SOFTWARE\$(var.OEMRegistryRootKeyName)\v7"
Value="ServerPath"
Result="value"
Variable="ServerInstalled"/>
<util:DirectorySearch
Path='[ServerInstalled]'
Variable='InstallFolder'
After='ServerInstalledCheck'
Condition='ServerInstalled' />
</Fragment>
我认为您可以直接在注册表搜索中设置变量InstallFolder并省略DirectorySearch。 DirectorySearch方法仅用于确保我们仅将InstallFolder设置为机器上实际存在的位置。可能还有其他优点,但目前我无法想到它们。
这将在全新安装时保留默认的InstallFolder位置,并在运行卸载/修改/升级时“记住”所选的安装位置。
你是对的,你不能依赖在你的bootstrapper应用程序中编写任何注册表项,因为它不能保证(实际上不应该)运行提升。
<小时/>
这基本上遵循'remember property'模式,解释为here。每当您想要在修改/升级/删除期间记住先前安装中设置的值时,通常都会转到。