2014-10-31 85 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; 
} 

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

相關問題