[英]Define a custom path where the user.config file should be saved?
如果我將已編譯的應用程序重命名為例如myapp.exe
到app.exe
那么當我運行重命名的可執行文件時,將在此路徑中生成一個新的用戶設置文件夾:
C:\Users\{User}\AppData\Local\{CompanyName}\{ExecutableName}_Url_{SystemGUID or something strange}
所以我放棄了所有保存的設置。
那我怎么能解決這個問題在VBNET
WinForms
定義我自己的位置來存儲user.config
文件,或使用applicationsettings基礎設施的任何其他解決方案? (不保存注冊表或其他內容的設置)
PS:我已經閱讀了這篇SO帖子,這是一個有點不同的問題,但無論如何我沒有理解所謂的解決方案我可以控制.NET用戶設置的位置,以避免丟失應用程序升級的設置嗎?
我想您也可以使用ConfigurationManager.OpenExeConfiguration方法從特定位置打開配置文件。
希望我幫忙!
更多信息和鏈接中的一個回答,回答您的問題:
你引用的“systemGUID或其他東西”實際上是2件事的散列(參考MSDN My.Settings ):
<eid> is the URL, StrongName, or Path, based on the evidence available to hash.
<hash> is a SHA1 hash of evidence gathered from the CurrentDomain,
in the following order of preference:
- StrongName
- URL If neither of these is available, use the .exe path.
如果沒有StrongName,您的位置會因路徑而異,這是您描述的問題。 由於BOTH eid和hash將使用StrongName作為哈希值,因此即使將其移動到其他位置或安裝新版本,完整路徑仍應保持不變。 使用StrongName時,憑據來自應用程序,並且哈希值不會更改,並且永遠不會使用最后的方法(exe路徑)。 這回答了你的基本問題:使用強名稱,路徑不會改變。
新版本/版本將在該文件夾下為“設置”的每個版本創建一個子文件夾樹。 鏈接中提到的Settings
的Upgrade
方法(顯然)有助於從/先前版本導入設置。 EXE名稱的更改將導致AppDomain.FriendlyName(第3個元素)發生更改。
隔離存儲是另一種選擇,它並不像它第一次看起來那么難,但具有類似的行為。 使用Iso,你不要指定一個文件夾,因為它只是在一個不起眼的位置創建一個文件夾,如Users\\<User>\\Isolated Storage\\zhxytg\\dhfyres\\
。 如果您使用ClickOnce(即,這是另一種可行的解決方案),即使您重命名,所以應用程序的所有版本的位置CAN都保持不變。
我認為你必須使用ClickOnce(StrongName作為MSDN中的替代品)才能獲得應用程序級證據。 作為附帶的好處,使用ISO,即使在最高安全性下,非管理員用戶也可以讀取/寫入ProgramData\\AllUsers
共享文件(可能是許可證的情況,或應用程序套件的共享設置),至少使用W7 。 應用程序的哈希允許它寫入該路徑,因此它可以做一些我們通常無法做的事情。
如果您不使用ClickOnce,您仍然可以獲得每個安裝的穩定文件夾以及對AllUsers
讀/寫。 新安裝(到不同的文件夾)將導致不同的散列和文件位置; 與更改文件名相同。 即使您設法將舊位置存儲在某處,新安裝也可能沒有舊文件的權限(沒有嘗試過)。
ISO刪除因EXEName而異,但它不使用My.Settings。 相反,你使用IsolatedFileStreams
通過創建IsolatedStorageFile
對象。 而且你必須接管組織和管理各種設置的值和名稱。 使用的隔離存儲類型(應用/用戶)取決於可用的憑據。
隔離存儲有它的位置,但似乎對於設置有點過分。
您提到通常只使用MySettings來處理瑣碎的應用程序。 因此,僅僅為了穩定設置路徑而使用StrongName似乎有點矯枉過正。 ISO非常有趣,但有一些更簡單的東西。 第三種選擇屬於您不想要的or other things
,但非常靈活。
圍繞序列化構建自己的設置類。 對於簡單設置,這些可能不僅僅是一組Name-Value Pairs {LastPath =“.....”; FormLeft = x; FormTop = y ...}。 將它們保存在Dictionary(Of String, String)
或Dictionary(Of enumSettings, String)
,只需序列化(保存)整個容器:
Dim bf As New BinaryFormatter
Using fs As New FileStream(myFile, FileMode.OpenOrCreate)
bf.Serialize(fs, _UserOpts)
End Using
獲得價值就是這么簡單。 對於有多種類型,以節省喜歡整數,日期,陣列,ArrayList中,列表(的T)等,為他們創造一個USEROPTIONS類和序列化,而不是更復雜的項目。
請注意,您將文件流傳遞給序列化程序,因此您可以完全控制名稱和位置,例如C:\\Users\\<username>\\AppData\\Local\\<Company>\\<Product>\\Settings.bin
位置不會按版本,文化,裝配等進行更改。它將保留在您放置的位置。
當您嘗試對Point,Size和Font等類型進行serilize時,這確實會耗盡,因為對象無法直接序列化。 特別是,使用ProtoBuff有多種選擇可以將這些轉換為可動態或事先可序列化的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.