我正在玩弄 .NET 的配置支持(ConfigurationManager 类和相关的支持类)。我想编写一个应用程序,一旦安装:
- 在 foo.exe.config(在程序文件中)中有默认设置。
- 用户稍后可以使用应该保留的非默认值覆盖设置。
- 用户的偏好应该保留在用户的配置文件中,因为他不应该对 Program Files 目录具有写权限。
应用程序在设置时应使用用户的首选项,否则使用默认值。
看起来这应该很容易——这是一种非常常见的模式。但是我在这方面的尝试遇到了障碍,我想知道我是否采取了正确的方法。
以下代码产生运行时异常“ConfigurationSection 属性在锁定时无法编辑”。
using System;
using System.Configuration;
namespace DemoAppSettingsProblem
{
class Program
{
static void Main(string[] args)
{
Configuration userConfig =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
if ( userConfig.AppSettings.Settings["foo"] != null )
userConfig.AppSettings.Settings.Remove("foo");
userConfig.AppSettings.Settings.Add("foo", "The string is foo.");
userConfig.Save(ConfigurationSaveMode.Modified); // exception!
}
}
}
问题是 .NET 定义的<appSettings>
部分是用默认声明的allowExeDefinition=MachineToApplication
(请参阅 Microsoft 的 Irena Kennedy 的这篇好文章)。这禁止将该部分写入用户的配置文件(本地或漫游)。
所以,我假设我需要定义我自己的部分,使用allowExeDefinition=MachineToLocalUser
. 但据我从 MSDN 文档中得知,这意味着我需要创建自己的配置类,从ConfigurationSection
. 那里的例子让我的工作比我预期的要多,这通常会引发我做错事的警钟。
做到这一点真的有那么难吗?.NET 是否提供了一种简单的方法来支持这一点,还是我应该完全采用不同的方法?