定义应保存user.config文件的自定义路径?

Ele*_*ios 10 .net vb.net application-settings user-config my.settings

如果我将我编译的应用程序重命名为例如myapp.exe,app.exe那么当我运行重命名的可执行文件时,将在此路径中生成一个新的用户设置文件夹:

C:\Users\{User}\AppData\Local\{CompanyName}\{ExecutableName}_Url_{SystemGUID or something strange}
Run Code Online (Sandbox Code Playgroud)

所以我放弃了所有保存的设置.

那么我如何解决在VBNET WinForms我自己的位置定义存储user.config文件或使用应用程序设置基础结构的任何其他解决方案的问题?(不保存注册表或其他内容的设置)

PS:我已经阅读了这篇SO帖子,这是一个有点不同的问题,但无论如何我没有理解所谓的解决方案我可以控制.NET用户设置的位置,以避免丢失应用程序升级的设置吗?

Pan*_*vas 7

我想您也可以使用ConfigurationManager.OpenExeConfiguration方法从特定位置打开配置文件.

希望我帮忙!


Ňɏs*_*arp 6

更多信息和来自链接的小贴士可回答您的问题:

你引用的"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.
Run Code Online (Sandbox Code Playgroud)

如果没有StrongName,您的位置会因路径而异,这是您描述的问题.由于BOTH eid和hash将使用StrongName作为哈希值,因此即使将其移动到其他位置或安装新版本,完整路径仍应保持不变.使用StrongName时,凭据来自应用程序,并且哈希值不会更改,并且永远不会使用最后的方法(exe路径).这回答了你的基本问题:使用强名称,路径不会改变.

新版本/版本将在该文件夹下为"设置"的每个版本创建一个子文件夹树.链接中提到的Upgrade方法Settings(显然)有助于从/先前版本导入设置.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.而是使用IsolatedFileStreamsIsolatedStorageFile对象创建的.而且你必须接管组织和管理各种设置的值和名称.使用的隔离存储类型(应用/用户)取决于可用的凭据.

隔离存储有它的位置,但似乎对于设置有点过分.


您提到通常只使用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
Run Code Online (Sandbox Code Playgroud)

获得价值就是这么简单.对于有多种类型,以节省喜欢整数,日期,阵列,ArrayList中,列表(的T)等,为他们创造一个USEROPTIONS类和序列化更复杂的项目不是.

请注意,您将文件流传递给序列化程序,因此您可以完全控制名称和位置,例如C:\Users\<username>\AppData\Local\<Company>\<Product>\Settings.bin 位置不会因版本,文化,程序集等而更改.它将保留在您放置的位置.

当您尝试对Point,Size和Font等类型进行serilize时,这确实会耗尽,因为对象无法直接序列化.特别是,使用ProtoBuff,有多种选项可以将这些转换为可动态或事先可序列化的内容.