.Net 用户范围应用程序设置文件路径问题

标签 .net filepath isolatedstorage application-settings

我正在使用 .Net Framework 3.5 及更高版本构建 Windows 窗体应用程序。我在使用用户范围内的应用程序设置时遇到问题。

当我第一次阅读用户范围应用程序设置时,我了解到我的应用程序会将设置与用户相关联。我还从 MSDN 了解到,设置将保留在路径下的 user.config 文件中: %LOCALAPPDATA%\CompanyName\ProductName\ProductVersion
这与字段 返回的完全相同的值Application.LocalUserAppDataPath
引用:http://msdn.microsoft.com/en-us/library/8eyb2ct1.aspx

这里的问题是,MSDN 中关于文件路径的所有内容都是完全错误的。并且实验清楚地表明文件路径实际上是: %LOCALAPPDATA%\companyname\appdomainname_eid_hash\verison

首先,我真的很想知道为什么这么重要的信息在 MSDN 中有错误的合理解释?

其次,这里的问题是我没有在 .Net 中使用部署方法(例如 Windows Installer 或 ClickOnce),我不打算使用它们,也不想使用它们。在这里,我只构建一个版本,他们将版本 exe 文件复制到主机。因为我没有使用安装程序,所以每次更改程序集(即 exe 文件)的位置时,.Net 框架都会将该程序集识别为不同的应用程序,并为其创建一个具有不同哈希和新 user.config 文件的新文件夹.这对我来说当然是一个问题,因为这意味着我正在考虑的不是“用户设置”,而是“用户和程序集设置”,这在逻辑上不适合我。我找不到用户可以将程序集重新定位到任何地方并且仍然可以访问相同设置文件的原因(正如 MSDN 错误地指出的那样!!)

此外,使用IsolatedStorage 时,我也面临同样的问题。同样在 IsolatedStorage 中,当程序集位于某个位置时,我存储的所有数据都完全无法访问,因为我重新定位 exe 文件的确切原因与应用程序设置问题中的确切原因相同。

我该如何解决这个问题,或者至少我可以知道带有散列的命名约定在.Net中的起源以及微软在决定相应地考虑exe重定位时可能做了什么推理?

最佳答案

我不知道为什么 MSDN 上的文档不正确,但您应该确保您查看的 .net 3.5 文档的正确版本位于 https://msdn.microsoft.com/en-us/library/8eyb2ct1(v=vs.90).aspx
另外,根据文档:

Settings File Locations

The location of the app.exe.config and user.config files will differ based on how the application is installed. (my emphasis added)


应用程序设置过程与您正在绕过的部署紧密耦合。即使单击一次,某些部署策略也需要根据您的应用程序以编程方式获取以前的版本设置 (https://msdn.microsoft.com/en-us/library/system.configuration.applicationsettingsbase.getpreviousversion(v=vs.90).aspx)
如果要求每次更新时都需要手动复制 .exe,那么滚动您自己的用户设置对象并使用序列化可能是更好的选择?然后,您可以将用户范围的设置存储在公共(public)位置,例如公共(public)应用程序文件夹,并在应用程序启动时根据用户反序列化用户设置。

关于.Net 用户范围应用程序设置文件路径问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13675445/

相关文章:

silverlight - 隔离存储、OOB 和删除应用程序

.net - 字符串数组是从函数传回值集合的好结构吗?

.net - 如何使用默认为 DateTimeKind.Utc 的 DateTime 值进行 DataSet.Fill?

Java - 从文件路径获取图像

windows-8 - 为什么我无法访问 System.IO 命名空间中的isolatedStorage?

silverlight - 使用隔离存储为应用程序中的模块提供离线模式

c# - 在 C# 中,将类标记为静态的目的是什么?

c# - 用常量替换表达式中的参数

python - 如何从已执行但未在其中声明的函数中获取模块的文件路径?

c#类库使用文件