1

我继承了在 WiX 中创建的 MSI 项目,现在我正在尝试解决一些不幸存在的问题。

有一个记住属性模式,用于查找保存在注册表项中的特定目录:

<Property Id="AUTO_FOUND_DIR" Secure="yes" Admin="yes">
      <RegistrySearch Id="regsrch_AUTO_FOUND_DIR"
                      Root="HKCU"
                      Key="$(var.RegPath)"
                      Name="$(var.SpecificKey)"
                      Type="raw"
      />
</Property>

然后将该SpecificKey值保存在AUTO_FOUND_DIR属性中。

然后黑魔法出现了。一个单独的组件持有(除其他外)位于ProgramMenuFolder(非广告)主可执行文件的快捷方式。

有人告诉我,使用 ofutil:RemoveFolderEx是一个旧问题的解决方法,在该问题中,此快捷方式是孤立的并且在卸载过程中没有被删除:

<Feature>
<DirectoryRef Id="ProgramMenuDir">
      <Component Id="cmp_ProgramMenuDir" Guid="{0E8BD13A-GUID-IS-HERE-6E5092ECA9EF}">
        <CreateFolder />
        <RemoveFolder Id='ProgramMenuDir' On='uninstall' />
        <RegistryKey Id='reg_SpecificKeyID' Root='HKCU' Key='$(var.RegPath)' ForceCreateOnInstall="yes">
          <RegistryValue Type='string' Name='$(var.SpecificKey)' Value='[ProgramMenuDir]'/>
        </RegistryKey>
        <!-- other content: shortcut to ProgramMenuFolder and other stuff -->
        <util:RemoveFolderEx Id="rm_dirID" On="install" Property="AUTO_FOUND_DIR"/>
      </Component>
    </DirectoryRef>
</Feature>

问题是:我不需要这种解决方法(以及AUTO_FOUND_DIR属性的使用。我已经删除了该代码,但在升级期间(主要,Product并且PackageGUID 设置为"*"UpgradeCode与以前的版本具有相同的值)我可以在详细日志中看到从AUTO_FOUND_DIR存在的MSI 中,RegistrySearch读取具有特定目录的键值,并因此util:RemoveFolderEx删除该目录和位于该目录的所有组件。

我的问题是:如何检测为什么在升级过程中使用这个旧属性以及如何摆脱它?

附加信息:安装范围为PerMachine,ALLUSERS设置为 1。升级版本的 MSI 已删除此属性。

4

1 回答 1

1

如果不仔细查看完整的详细日志以了解发生了什么,请记住升级会卸载旧安装的产品。这意味着旧安装产品中的许多逻辑将在升级期间发生。因此,您肯定会看到 RegistrySearch 在旧产品卸载时运行,设置为 AUTO_FOUND_DIR,并且您将看到在卸载期间运行的 RemoveFolder。

因此,如果您所看到的只是被卸载的旧产品的卸载活动,您是否真的有问题尚不清楚。该活动嵌入在已安装的产品中。

于 2017-08-19T17:48:55.313 回答