【发布时间】:2017-01-09 11:19:38
【问题描述】:
.NET 配置设置功能不像我希望的那样灵活。 如果我正确理解Application Settings,我将受限于何时可以更改/编辑设置。在 C# 中,应用程序设置分为两种不同的类型或范围(“应用程序”和“用户”),但在如何更改或修改它们方面都有限制。下表说明了不同之处:
范围:|设计时编辑:|运行时编辑:|会话之间的编辑: -------------------------------------------------- ------------------------------------- 用户 |设置.settings | Settings.Default.Save() | *不支持* 应用 |设置.settings | *不支持* |编辑 app.exe.config是否有任何“内置”设置功能允许我通过所有三种机制编辑设置?使用配置文件的主要动机之一是允许用户在不重新构建源代码的情况下更改默认值(可以通过 Application-scoped 设置来完成)。但是,不应强制用户编辑 .config 文件;他们还应该能够在运行时进行跨设置持续的更改(可以通过 User-scoped 设置来完成)。肯定有某种机制可以同时提供这两种功能。
底线:为什么不能在运行时编辑应用程序设置 (app.exe.config)?那将解决我所有的问题。 我了解这可能会给共享同一台机器的用户带来问题。但是谁再这样做了?
可能的解决方法:是否可以将用户设置配置文件的默认存储位置更改为非隐藏文件夹?
更新(澄清):
我的意思是我希望能够在设计时、运行时、或更改默认设置中间会话(即,通过编辑配置文件)。但是当使用Settings.settings提供的内置C#持久化机制时,我必须从3个中选择最多2个。我错过了什么吗?还有其他我不知道的选择吗?
[用例: 我想为连接字符串存储一个“默认”数据库名称,但我希望用户能够指定一个运行时不同的数据库(从而成为该用户的“新”默认值)。但我也希望能够覆盖配置文件中的默认值,而无需重新运行或重新构建应用程序。]
[更好的用例:(响应 cmets)
我有一个计算模型,其配置文件包含模型中参数的默认值。用户 A 启动模型并决定更改几个参数的值。该更改需要持续用于该用户 (即在运行时编辑)的所有未来会话。 随后,该用户想要共享修改后的内容与他的团队共享配置文件(例如,通过版本控制存储库或电子邮件)。这将允许用户 B 更新她的默认参数值(以匹配用户 A),而无需在应用程序中手动更改它们(即,在会话之间编辑)。所有这些模块都应该在设计之后发生-时间。]
*我意识到我可以“技术上”在位于隐藏 AppData 文件夹中的 app.exe.config 文件中编辑用户范围的设置,但这是一个隐藏文件,并非所有用户都有足够的权限查看它。 (但请参阅上面的“潜在解决方法”。)
【问题讨论】:
-
由于我缺乏知识,我还没有克服这种情况。但是使用 app.config 您可以在名称值对中定义您的设置,并可以在运行时相应地选择名称。
-
在了解
C#后不久,我学到的第一件事就是序列化。虽然字典很好,但它们不适合包含复杂的数据,每次访问数据时都需要强制转换,容易包含错误(尤其是由于用户编辑)......序列化/反序列化使用XmlSerializer非常简单,所以为什么要麻烦有Settings吗?我发现 json 是保存设置的最佳格式。 -
如果没有管理员提升,用户应该无法更新适用于所有用户的设置,因为一个用户可能会做出会影响其他用户的不良更改。因此,更改应用程序设置更难是完全有道理的......
-
@kmote:可以在会话之间编辑用户设置!唯一的区别是用户设置存储在用户文件夹中。另见:stackoverflow.com/q/982354/6439999
-
我觉得这是一个寻找问题的解决方案。为什么您会允许任何用户更改所有用户的应用行为?对我来说听起来很混乱。你有实际用例吗?
标签: c# application-settings settings.settings