2013-03-22 44 views
4

我目前正在維護一個具有用戶定義的註冊表項加載的軟件。 我試圖做一個WIX安裝程序,保持這些註冊表鍵與至少 數量的可維護性。我決定讓每個值都在一個註冊表鍵中,它是自己的組件,允許我使用WIX的NeverOverwrite ='yes'功能。我認爲這樣做會允許次要升級(例如REINSTALL = ALL REINSTALLMODE = vomus),如果它存在,則創建該值,否則將其保留。但是,這似乎並沒有發生在我的真實世界的例子(功能沒有條件)。文件告訴我我應該很好。下面是幾樣:註冊表值在執行Wix次要升級後消除

<Product Id="UNIQUE_KEY" Name="Spotbox Manager" Language="1033" Version="1.0.1.0" Manufacturer="Company" UpgradeCode="MY_UPGRADE_KEY"> 
<Package Platform="x64" Id="*" InstallerVersion="200" Compressed="yes" InstallScope="perMachine" InstallPrivileges="elevated" /> 
<Upgrade Id="MY_UPGRADE_KEY"> 
    <UpgradeVersion OnlyDetect='yes' Property='SELFFOUND' 
    Minimum='1.0.1' IncludeMinimum='yes' 
    Maximum='1.0.1' IncludeMaximum='yes' /> 
    <UpgradeVersion OnlyDetect='yes' Property='NEWERFOUND' 
    Minimum='1.0.1' IncludeMinimum='no' /> 
</Upgrade> 

這是註冊表項的實際片段

<Component Id="cmp171812fcc51a4b91ad386fa8c27c9b89" Directory="TARGETDIR" Guid="COMPONENT_GUID" Win64='yes' NeverOverwrite='yes'> 
    <RegistryKey Key="SOFTWARE\Company" Root="HKLM"> 
    <RegistryValue Name="Value" Value="1100797834" Type="integer" KeyPath='yes'/> 
    </RegistryKey> 
</Component> 
<Component Id="cmp211639bff9694f029028a22cb0bb9687" Directory="TARGETDIR" Guid="NEW COMPONENT GUID" Win64='yes' NeverOverwrite='yes'> 
    <RegistryKey Key="SOFTWARE\Company" Root="HKLM"> 
    <RegistryValue Name="Country Code" Value="1" Type="integer" KeyPath='yes' /> 
    </RegistryKey> 
</Component> ... 

請注意:關鍵是這兩個值這似乎仍然吹走用戶的價值時相同我嘗試改變它。

+0

您究竟如何設置GUID?並且,嘗試在NeverOverwrite旁邊啓用永久。 – 2013-03-22 20:47:06

+0

我收到來自Resharpers nguid snippet命令的guid。我不明白Permanant會如何處理。我是否將它與NeverOverwrite一起使用或者替代? – 2013-03-22 21:32:15

+0

有。如果我知道爲什麼(在你的情況下),這將是一個答案,而不是一個評論。 – 2013-03-22 21:34:12

回答

1

首先,在同一註冊表項下使用多個值並將它們用作單獨的鍵路徑沒有問題。術語「keypath」與註冊表術語無關,並且在註冊表的情況下,它實際上必須標識一個值而不是一個密鑰。

其次,您的意見提到產品卸載不會在次要升級過程中發生。這在產品級別上是正確的,但不是在組件級別上。

您應該檢查您是否未更改產品舊版本和新版本之間行爲不當組件的GUID或keypath - 如果是這樣,您明顯違反了小規模升級(組件刪除)的規則。但是,即使您的GUID穩定,請繼續閱讀,我對您有更通用的解釋。

次要更新是重新安裝。我正在想象下面的事件順序。

  1. (CostFinalize)Windows安裝檢查該相同的部件每的keyPath已經安裝(未重寫或由用戶刪除的),因此不必安裝;根據NeverOverwrite被啓用)。
  2. (InstallExecute)Windows安裝程序將卸載舊MSI中的組件,因爲該組件將由新的MSI(由次要更新規則保證)替換;根據舊包裝中的Permanent被禁用。
  3. (InstallExecute)Windows安裝程序會記住步驟1中的檢查,並且不會考慮使用相同的keypath安裝不同的組件。

您至少有這些選項進行更正,選擇一個。

  • 進行重大升級。這幾乎總是更容易和更好的選擇。
  • 啓用Permanent除了NeverOverwrite,假設您可以在所有版本中這樣做;基本上,你還沒有發佈任何明確的。大多數人保持這些屬性同步,所以爲什麼不跟隨人羣並減少問題。
  • 亂用順序的行動。例如:

    <RemoveExistingProducts After="InstallValidate"/>

這最後的選擇會讓你的升級速度較慢,但​​是這可能是必要的,如果你真的想輕微的升級和利用NeverOverwritePermanent

+0

我將在明天嘗試運行processmonitor並查看是否有任何刪除操作,然後添加密鑰或者只是將其覆蓋。我也會保留永久的。我很幸運,它還沒有被部署到生產中,所以我有一段時間以我想要的方式獲得它。 – 2013-03-25 08:30:06

0

我發現它是一個用戶錯誤的問題我在註冊表中有這麼多的值,我沒有注意到另一個類似的部分,但沒有組件元素(舊配置)。我刪除它後,一切按預期工作。謝謝你們的幫助。