Dot-Net-2.0

我可以控制 .NET 使用者設置的位置以避免在應用程序升級時失去設置嗎?

  • March 7, 2009

我正在嘗試自定義user.config文件的位置。目前它與雜湊和版本號一起儲存

%AppData%\[CompanyName]\[ExeName]_Url_[some_hash]\[Version]\

我希望它與應用程序的版本無關

%AppData%\[CompanyName]\[ProductName]\

**這可以做到嗎?怎麼做?有什麼影響?**升級後使用者會失去以前版本的設置嗎?

要回答第一個問題,從技術上講,您可以將文件放在您想要的任何位置,但是您必須自己編寫程式碼,因為文件的預設位置是您的兩個範例中的第一個。(連結到如何自己做

至於第二個問題,這取決於你如何部署應用程序。如果您通過 .msi 進行部署,則安裝項目(建構 msi)的屬性中有兩個雜湊值,即“升級程式碼”和“產品程式碼”。這些決定瞭如何安裝 msi,以及它是否升級、覆蓋或安裝在同一應用程序的任何其他版本旁邊。

例如,如果您有兩個版本的軟體並且它們具有不同的“升級”程式碼,那麼對於 Windows,無論名稱是什麼,它們都是完全不同的軟體。但是,如果“升級”程式碼相同,但“產品”程式碼不同,那麼當您嘗試安裝第二個 msi 時,它會詢問您是否要升級,此時它應該從舊配置到新配置。如果兩個值相同,並且版本號沒有更改,那麼新配置將與舊配置位於同一位置,並且無需執行任何操作。 MSDN 文件

ClickOnce 有點不同,因為它更多地基於 ClickOnce 版本號和 URL 路徑,但是我發現只要您繼續“發布”到同一位置,新版本的應用程序將繼續使用現有配置。(連結到 ClickOnce 如何處理更新

我也知道有一種方法可以在安裝 msi 期間使用自定義安裝腳本手動合併配置,但我不記得執行此操作的確切步驟…(有關如何使用 web.xml 執行此操作的連結,請參閱連結。配置)

我想添加此引用的文本作為將來遇到此問題時的參考。假設您可以通過呼叫Upgrade指示 ApplicationSettings 基礎結構從以前的版本複制設置:

Properties.Settings.Value.Upgrade();

來自客戶端設置常見問題解答部落格文章*:(存檔)*

Q:為什麼user.config路徑中有版本號?如果我部署新版本的應用程序,使用者不會失去之前版本保存的所有設置嗎?

答:user.config 路徑對版本敏感的原因有兩個。

(1) 支持應用程序不同版本的並行部署(例如,您可以使用 Clickonce 來做到這一點)。不同版本的應用程序可以保存不同的設置。

(2) 升級應用程序時,設置類可能已更改,可能與保存的內容不兼容,這可能會導致問題。

但是,我們可以輕鬆地將設置從應用程序的早期版本升級到最新版本。只需呼叫 ApplicationSettingsBase.Upgrade(),它就會從先前版本中檢索與目前版本的類匹配的設置,並將它們儲存在目前版本的 user.config 文件中。您還可以選擇在設置類或提供程序實​​現中覆蓋此行為。

問:好的,但我怎麼知道何時呼叫升級?

答:好問題。在 Clickonce 中,當您安裝應用程序的新版本時,ApplicationSettingsBase 將檢測到它並在載入設置時自動為您升級設置。在非 Clickonce 的情況下,沒有自動升級 - 您必須自己呼叫升級。這是確定何時呼叫升級的一種方法:

有一個名為 CallUpgrade 的布爾設置,並給它一個預設值 true。當您的應用啟動時,您可以執行以下操作:

if (Properties.Settings.Value.CallUpgrade)
{
  Properties.Settings.Value.Upgrade();
  Properties.Settings.Value.CallUpgrade = false;    
}

這將確保僅在部署新版本後應用程序第一次執行時呼叫 Upgrade()。

我根本不相信它真的可以工作——微軟不可能提供這種能力,但方法是一樣的。

引用自:https://stackoverflow.com/questions/621265