none
自定义操作app.config,ConfigurationSection与ConfigurationElementCollection RRS feed

  • 问题

  • 最近再操作一个自定义XXX.exe.confg,想通过代码来创建节点,一般我们会继承ConfigurationSection,就可以简单实现

    class Extension:ConfigurationSection { [ConfigurationProperty("type")] public string type { get { return (string)this["type"]; } set { this["type"] = value; } } }

    private void button3_Click(object sender, EventArgs e)
            {
                ExeConfigurationFileMap file=new ExeConfigurationFileMap();
                file.ExeConfigFilename = "bl.exe.config";
                Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
                Extension extension=new Extension();
                extension.type = extension.GetType().ToString();
                config.SectionGroups.Add("customSection", new ConfigurationSectionGroup());
                config.SectionGroups["customSection"].Sections.Add("extension", extension);
        
                config.Save(ConfigurationSaveMode.Minimal);
            }

    //xml

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <configSections>
            <sectionGroup name="customSection" >
                <section name="extension" type="XXX" />
            </sectionGroup>
        </configSections>

        <customSection>
           <extension name = "A" type="XXX" />
        </customSection>
    </configuration>

    如果xml机构再复杂一些 如下,<extensions>下面有多个extension,<builders>也存在多个builder,那么我们代码如何实现创建,虽然可以自定义对象序列化xml实现暂且不想用这种方式,查阅了微软帮助文档ConfigurationElementCollection类 但是最后我没搞出来如何添加多个集合,求助大家如何操作,请贴出详细代码以便学习

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <configSections>
            <sectionGroup name="customSection" >
                <section name="extension" type="XXX" />
    	     <section name="builders" type="XXX" />
            </sectionGroup>
        </configSections>
        <customSection>
          <extensions>
           <extension name = "A" type="XXX" />
    	<extension name = "B" type="XXX" />
           <extensions>
          <builders>
           <builder type ="" CheckAssemblyInfo="false" mside9 = "\Microsoft Visual Studio 9.0\IDE\devenv.com"/>
           <builder type ="" CheckAssemblyInfo="false" mside10 = "\Microsoft Visual Studio 10.0\IDE\devenv.com"/>
           </builders>
        </customSection>
    </configuration>


    啥叫乐观-得瑟的最高境界

    2013年9月13日 7:26

答案

全部回复

  • 感觉思路如下:

    遍历SectionGroups

    找到customSection

    遍历Sections

    找到builders

    然后操作

    这个是否可以?


    family as water

    2013年9月13日 8:19
  • 我是要通过代码如何添加,而不是如何获取,获取通过xpath 就可以,是添加,如何通过代码添加集合


    啥叫乐观-得瑟的最高境界

    2013年9月14日 8:04
  • 前辈,我是要如何在代码里添加,而不是获取,你发我连接都是GetSection

    啥叫乐观-得瑟的最高境界

    2013年9月14日 8:05
  • hello,

    调用Add就可以了啊,重点是Configuration Collection类的定义...


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年9月14日 9:50
  • 你好,余大

     ExeConfigurationFileMap file=new ExeConfigurationFileMap();
                file.ExeConfigFilename = "bl.exe.config";
                Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
                Extension extension=new Extension();
                extension.type = extension.GetType().ToString();
                config.SectionGroups.Add("customSection", new ConfigurationSectionGroup());
                config.SectionGroups["customSection"].Sections.Add("extension", extension);
        
                config.Save(ConfigurationSaveMode.Minimal);

    在上面代码 config.SectionGroups["customSection"].Sections.Add 我测试过save会报错,你能贴个demo吗


    啥叫乐观-得瑟的最高境界

    2013年9月14日 12:15
  • hello,

    您的ConfigurationElement怎麽写的?


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年9月14日 15:06
  • hello,

    我运行您的代码,基本上可以执行,你会出错因为 Section 已经存在 ,Add 之前要先判断Section 是否存在,或是直接砍掉 Section 再加入,最快的方式就是把整个文件(bl.exe.config)杀了~

    http://www.dotblogs.com.tw/yc421206/archive/2010/08/08/17076.aspx

    看来您的问题并非自定 configuration,而是 section 操作,建议您下次把错误讯习贴上,便可减少答非所问的情况

    ExeConfigurationFileMap file = new ExeConfigurationFileMap();
    file.ExeConfigFilename = "bl.exe.config";
    Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
    Extension extension1 = new Extension() { type = "1" };
    Extension extension2 = new Extension() { type = "2" };
    
    var sectionGroup = config.GetSectionGroup("customSection");
    if (sectionGroup == null)
    {
        config.SectionGroups.Add("customSection", new ConfigurationSectionGroup());
    }
    
    for (int i = sectionGroup.Sections.Count; i >= 1; i--)
    {
        sectionGroup.Sections.Remove("extension" + i));
    }
    
    config.SectionGroups["customSection"].Sections.Add("extension1", extension1);
    config.SectionGroups["customSection"].Sections.Add("extension2", extension2);
    
    config.Save(ConfigurationSaveMode.Minimal);

    运行结果如下:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <configSections>
            <sectionGroup name="customSection" type="System.Configuration.ConfigurationSectionGroup, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" >
                <section name="extension1" type="Custom_ConfigurationElement.Extension, Custom_ConfigurationElement, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
                <section name="extension2" type="Custom_ConfigurationElement.Extension, Custom_ConfigurationElement, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
            </sectionGroup>
        </configSections>
        <customSection>
            <extension1 type="1" />
            <extension2 type="2" />
        </customSection>
    </configuration>



    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/


    2013年9月14日 16:04
  • ths 余小章,我已经自己解决了,我要的xml格式是

    <customSection> <extensions> <extension name = "A" type="XXX" /> <extension name = "B" type="XXX" /> <extensions>

    而你实现的是

    <customSection>
           
    <extension1 type="1" />
           
    <extension2 type="2" />
       
    </customSection>
    其实之前我问的问题就是这个集合与
    ConfigurationElementCollection 如何添加,

    现在已经搞定,还是非常感谢你的帮助和提供的参考文章



    啥叫乐观-得瑟的最高境界

    2013年9月15日 2:51
  • hello,

    这是依您描述的

    "在上面代码 config.SectionGroups["customSection"].Sections.Add 我测试过save会报错,你能贴个demo吗"

    所回复,您一下說是Collection問題,一下说无法Add,令人困扰啊~


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/


    2013年9月15日 15:46