如何找到Wix Burn可执行文件的GUID以便以编程方式卸载?

时间:2014-10-31 13:07:01

标签: wix uninstall burn

我已经创建了wix bootstrapper项目。安装时会创建注册表项

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{SOME_GUID}

所以我可以使用ARP卸载它。但是我想以编程方式卸载它。为此,我需要{SOME_GUID}的值来在注册表中搜索UninstallString值的键。但是,从我的项目中获取此信息是不可能的,因为Bundle元素没有用于设置此GUID的属性。


我发现此GUID等于Bundle的ProviderKey GUID,但仅限于自动分配ProviderKey。当我尝试使用bundle“ProviderKey”属性更改ProviderKey时,这两个GUID不再相等。

2 个答案:

答案 0 :(得分:1)

每次编译引导程序项目时,都会为其分配一个新标识 - 一个名为BundleId的GUID,您无法更改。在这方面,您创建的每个捆绑都是唯一的。 UpgradeCode属性允许我们链接两个bootstrappers,使它们成为相关的bundle。此关系允许一个捆绑包检测并升级另一个捆绑包的已安装包。

答案 1 :(得分:0)

如果您只想获取“当前”软件包的ID,那么您可以在运行时从BootstrapperApplicationData.xml中读取它。不确定是否有更好的方法来做到这一点。


但是,如果您的问题是并排安装了同一版本(不同版本)的引导程序的多个实例,请继续阅读...

我遇到了类似的问题:因为每次编译引导程序时你的bundle都有一个新的ID,这意味着如果我再次尝试安装它就会安装另一个bundle的实例(带有新的ID)然后我有了ARP中的2个我的捆绑实例。 (真的不知道这个用例是什么..)

我不想要捆绑的2个实例,特别是如果它们是相同的版本。我找到的唯一解决方案是使用其中一个引导程序的事件PlanRelatedBundle来删除任何“相关”包:

private void BootstrapperOnPlanRelatedBundle(object sender, PlanRelatedBundleEventArgs e)
{
    e.State = RequestState.Absent;
}

注意:我不确定这是否是解决此问题的最佳方式,但考虑到文档不佳,我发现它是最好的。