簡體   English   中英

定義應保存user.config文件的自定義路徑?

[英]Define a custom path where the user.config file should be saved?

如果我將已編譯的應用程序重命名為例如myapp.exeapp.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路徑)。 這回答了你的基本問題:使用強名稱,路徑不會改變。

新版本/版本將在該文件夾下為“設置”的每個版本創建一個子文件夾樹。 鏈接中提到的SettingsUpgrade方法(顯然)有助於從/先前版本導入設置。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM