我可以控制 .NET 使用者設置的位置以避免在應用程序升級時失去設置嗎?
我正在嘗試自定義
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()。
我根本不相信它真的可以工作——微軟不可能提供這種能力,但方法是一樣的。