通过configuration manager从AppSettings中获取StringCollection

通过configuration manager从AppSettings中获取StringCollection,configuration,c#-2.0,configurationmanager,Configuration,C# 2.0,Configurationmanager,我正在访问程序集的配置,如下所示: ExeConfigurationFileMap map = new ExeConfigurationFileMap(); map.ExeConfigFilename = Assembly.GetExecutingAssembly().Location + ".config"; Configuration conf = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLe

我正在访问程序集的配置,如下所示:

ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = Assembly.GetExecutingAssembly().Location + ".config";
Configuration conf = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
AppSettingsSection appSettings = conf.AppSettings;
My.config文件包含如下部分

<configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <section name="CsDll.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
</configSections>
<connectionStrings>
    <add name="CsDll.Properties.Settings.SabreCAD" connectionString="A Connection string." />
    <add name="CsDll.Properties.Settings.StpParts" connectionString="Another connection string" />
</connectionStrings>
 <applicationSettings>
        <CsDll.Properties.Settings>
            <setting name="StpInsertSearchPath" serializeAs="Xml">
                <value>
                    <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                        <string>A string</string>
                        <string>Another string in the collection</string>

一串
集合中的另一个字符串

如果编辑.config文件,我可以成功读取包括更改的连接字符串。因此,我知道我连接到了正确的文件。但是我在appSettings对象中找不到该字符串集合。它不在.Settings KeyValueConfigurationCollection中。在哪里可以找到字符串集合?

您的连接字符串通常位于configuration manager的ConnectionString属性中。您应该能够通过其静态方法以更简单的方式进行访问

string myConnectionString = ConfigurationManager.ConnectionStrings["connectioStringName"];
我认为您应该在.config文件中使用标记“AppSettings”而不是“ApplicationSettings”,以使ConfigurationManager能够通过AppSettings属性进行访问

我不知道ConfigurationManager是如何工作的,因此无法确定这是否会解决您的问题,但是重命名它并删除该自定义分区组应该可以让AppSettings正常工作

编辑 是,ConfigurationManager的AppSettings属性似乎访问名为
在.config文件中。

您应该可以使用此更简单的语法访问集合中的项

foreach(csdl.Properties.Settings.Default.StpInsertSearchPath中的字符串s)
{
控制台。写入线(s);
}
编辑:

下面的代码应该可以做到这一点

ExeConfigurationFileMap=newexeconfigurationfilemap();
map.ExeConfigFilename=Assembly.getExecutionGassembly().Location+“.config”;
Configuration conf=ConfigurationManager.OpenMappedExeConfiguration(map,ConfigurationUserLevel.None);
ConfigurationSectionGroup appSettingsGroup=conf.GetSectionGroup(“应用程序设置”);
ClientSettingsSection clientSettings=(ClientSettingsSection)appSettingsGroup.Sections[“csdl.Properties.Settings”];
ConfigurationElement=clientSettings.Settings.Get(“stInsertSearchPath”);
字符串xml=((SettingElement)元素);
XmlSerializer xs=新的XmlSerializer(typeof(string[]);
string[]strings=(string[])xs.Deserialize(新的XmlTextReader(xml,XmlNodeType.Element,null));
foreach(字符串中的字符串s)
{
控制台。写入线(s);
}

可能有一种较短的方法,但这对我很有效。

AppSettings和ConnectionString都是ConfigurationManager上直接提供的属性

但是,应用程序设置用户设置,它们与熟悉的设置相对应。您可以在VS设置设计器中编辑的设置并不容易获取AppSettingsapplicationSettings不同,后者位于所用配置文件的完全不同部分

您必须使用上述挖掘方法或变体来获取应用程序设置用户设置。此外,应用程序设置只有在下次启动应用程序时才会更新,前提是您甚至能够在运行时写入它们

例如(从其他地方抄袭-谢谢):

还有一个例子(从许多例子中可以看出——感谢全世界):

///
///返回applicationSettings部分
///
///
公共静态ClientSettingsSection GetSettingsSection(配置SectionGroup组,字符串clientSectionName)
{
返回(ClientSettingsSection)组。节[clientSectionName];
}
///
///返回节设置集合
///
///
公共静态System.Configuration.SettingElement集合GetSettingsCollection(客户端设置部分)
{
返回部分。设置;
}
///
///返回ConnectionString节集合
///
///
公共静态System.Configuration.SettingElementCollection连接字符串集合()
{
返回((ClientSettingsSection)SharedConfigSettings.GetSection(“ConnectionString”)).Settings;
}
///
///SettingElementCollection中所有用户设置的集合
///
///
公共静态设置元素集合用户设置()
{
返回
GetSettingsCollection(GetSettingsSection(GetSettingsSectionGroup)(@“userSettings”),
@“MyAssembly.Properties.Settings”);
}
///
///SettingElementCollection中所有应用程序设置的集合
///
///
公共静态设置元素集合应用程序设置()
{
返回
GetSettingsCollection(GetSettingsSection(GetSettingsSectionGroup)(@“应用程序设置”),
@“MyAssembly.Properties.Settings”);
}
然后,不幸的是,您仍然需要处理这些部分中设置集合中的SettingElement对象。每个属性类型都必须反序列化为属性类型,除非它是字符串,例如applicationSettings SettingElement(无法在运行时动态更新的元素):

(练习者)

变量y=GetSettingsSection(GetSettingsSectionGroup(@“applicationSettings”),@“MyAssembly.Properties.Settings”); var c=(y.Settings.Cast().FirstOrDefault(s=>s.Name==“WellKnownDirectory”).Value.xml .InnerXml;//设置为Xml var xs=新的XmlSerializer(typeof(string[]); var strings=(string[])xs.Deserialize(新的XmlTextReader(c,XmlNodeType.Element,null)); foreach(字符串中的字符串s) { 控制台。写入线(s); } 对于字符串属性,它更容易(这个示例与firs基本上是冗余的)
public static string ReadSetting(string sectionGroupName, string sectionName, string settingName, Configuration config = null)
    {
        if (config == null)
            config = SharedConfigSettings;
        // Get sectionGroup
        var sectionGroup =
          config.GetSectionGroup(sectionGroupName);

        // Get section
        var section =
          (ClientSettingsSection)sectionGroup.Sections.Get(sectionName);
        // Get setting
        var setting = section.Settings.Get(settingName);
        // Read setting value
        return setting.Value.ValueXml.InnerText;
    }
///<summary>
    /// return the applicationSettings section 
    ///</summary>
    ///<returns></returns>
    public static ClientSettingsSection GetSettingsSection(ConfigurationSectionGroup group, string clientSectionName)
    {
        return (ClientSettingsSection)group.Sections[clientSectionName];
    }


    ///<summary>
    /// return the section settings collection
    ///</summary>
    ///<returns></returns>
    public static System.Configuration.SettingElementCollection GetSettingsCollection(ClientSettingsSection section)
    {
        return section.Settings;
    }

    ///<summary>
    /// return the connectionStrings section collection
    ///</summary>
    ///<returns></returns>
    public static System.Configuration.SettingElementCollection ConnectionStringsCollection()
    {
        return ((ClientSettingsSection)SharedConfigSettings.GetSection("connectionStrings")).Settings;
    }

    ///<summary>
    /// A collection of all the UserSettings in a SettingElementCollection
    ///</summary>
    ///<returns></returns>
    public static SettingElementCollection UserSettings()
    {
        return
            GetSettingsCollection(GetSettingsSection(GetSettingsSectionGroup(@"userSettings"),
                                                     @"MyAssembly.Properties.Settings"));
    }

    ///<summary>
    /// A collection of all the ApplicationSettings in a SettingElementCollection
    ///</summary>
    ///<returns></returns>
    public static SettingElementCollection ApplicationSettings()
    {
        return
            GetSettingsCollection(GetSettingsSection(GetSettingsSectionGroup(@"applicationSettings"),
                                                     @"MyAssembly.Properties.Settings"));
    }
 var y = GetSettingsSection(GetSettingsSectionGroup(@"applicationSettings"), @"MyAssembly.Properties.Settings");
 var c = (y.Settings.Cast<SettingElement>().FirstOrDefault(s => s.Name == "WellKnownDirectories").Value).ValueXml
                .InnerXml; // the setting as Xml
 var xs = new XmlSerializer(typeof(string[]));
 var strings = (string[])xs.Deserialize(new XmlTextReader(c, XmlNodeType.Element, null));

foreach (string s in strings)
        {
            Console.WriteLine(s);
        }
var s = (y.Settings.Cast<SettingElement>().FirstOrDefault(s => s.Name == "MyUserSettingName").Value).ValueXml
                .InnerText
var strings = (StringCollection) Properties.Settings.Default["StpInsertSearchPath"];