代码之家  ›  专栏  ›  技术社区  ›  David Pope

是否必须从配置节派生以支持每个用户的设置?

  •  3
  • David Pope  · 技术社区  · 15 年前

    我在玩.NET的配置支持(ConfigurationManager类和相关的支持类)。我想编写一个应用程序,一旦安装:

    • 在foo.exe.config中有默认设置(在程序文件中)。
    • 用户稍后可以使用应保持的非默认值覆盖设置。
    • 用户的首选项应该保存在用户的配置文件中,因为他不应该对程序文件目录有写权限。

    应用程序应该在设置时使用用户的首选项,否则使用默认值。

    这看起来应该很容易——这是一个非常常见的模式。但我在这方面的尝试遇到了困难,我想知道我是否采取了正确的方法。

    以下代码生成运行时异常“锁定时无法编辑配置节属性”。

    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 (见此 nice post 微软的艾琳娜·肯尼迪)。这将禁止将分区写入用户的配置文件(本地或漫游)。

    所以,我想我需要定义我自己的部分, allowExeDefinition=MachineToLocalUser . 但就我从msdn文档中可以看出,这意味着我需要创建自己的配置类,该类派生自 ConfigurationSection . 那里的例子说明我做的工作比预期的要多,这通常会让我敲响警钟,说我做错了什么。

    真的很难做到吗?有没有一种.NET提供的支持这一点的简单方法,或者我应该完全采用不同的方法?

    2 回复  |  直到 15 年前
        1
  •  2
  •   MrTexas    15 年前

    我使用了设置功能,它将用户设置写入应用程序配置…

    http://msdn.microsoft.com/en-us/library/aa730869(VS.80).aspx

        2
  •  1
  •   marc_s Anurag    15 年前

    假设您在.NET 2.0及更高版本上,您是否签出了“设置”文件?这些都存储在app.config-应用程序设置中 <applicationSettings> 部分,用户在<user settings>中可定义的设置,附带有 allowExeDefinition=MachineToLocalUser 你提到的设置。

    也许这是一种方法?这些用户设置是一个定义的类型,如果需要的话,可以使用不同的名称(“mysettings”)。

    马克