2014-10-31 86 views
3

我已经创建了wix bootstrapper项目。安装时它会创建注册表项如何查找Wix Burn可执行文件的GUID以编程方式卸载?

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

这样我就可以使用ARP.But卸载它,我想卸载它programmatically.To做到这一点,我需要{} SOME_GUID的值来搜索UninstallString注册表的关键值。然而,从我的项目中获取这些信息是不可能的,因为Bundle元素没有属性来设置这个GUID。


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

回答

1

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

+0

感谢您的回复。据我了解,我无法更改此BundleID /但有没有办法获得它的价值?然后,我可以将它保存在像“SOFTWARE \ MyProgram \ BundleId”这样的节目中,然后用于卸载 – 2014-11-05 12:28:08

0

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


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

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

我不希望捆绑的2个实例,特别是如果它们是相同的版本。我发现的唯一的解决方案是使用引导程序的事件PlanRelatedBundle之一,以消除任何“相关的”捆绑:

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

注:我不知道这是否是去了解这一点的最好方式,但考虑到差的文件,这是我找到的最好的。

相关问题