获得一个StringCollection出来的AppSettings通过配置管理器(Getting

2019-09-22 07:12发布

我访问这样我组装的配置:

ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = Assembly.GetExecutingAssembly().Location + ".config";
Configuration conf = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
AppSettingsSection appSettings = conf.AppSettings;

我的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。 在哪里可以找到我的字符串集合?

Answer 1:

你应该使用这个简单的语法是访问集合中的项

foreach (string s in CsDll.Properties.Settings.Default.StpInsertSearchPath)
{
    Console.WriteLine(s);
}

编辑:

下面的代码应该做的伎俩

ExeConfigurationFileMap map = new ExeConfigurationFileMap(); 
map.ExeConfigFilename = Assembly.GetExecutingAssembly().Location + ".config"; 
Configuration conf = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); 
ConfigurationSectionGroup appSettingsGroup = conf.GetSectionGroup("applicationSettings");
ClientSettingsSection clientSettings = (ClientSettingsSection) appSettingsGroup.Sections["CsDll.Properties.Settings"];
ConfigurationElement element = clientSettings.Settings.Get("StpInsertSearchPath");
string xml = ((SettingElement)element).Value.ValueXml.InnerXml;
XmlSerializer xs = new XmlSerializer(typeof(string[]));
string[] strings = (string[])xs.Deserialize(new XmlTextReader(xml, XmlNodeType.Element, null));
foreach (string s in strings)
{
    Console.WriteLine(s);
}

有可能是一个更短的路,但是这对我的作品。



Answer 2:

的AppSettings和的ConnectionStrings直接可在ConfigurationManager中两个属性。

然而,和的applicationSettings userSettings,对应于你可以在VS设置设计编辑的熟悉Settings.settings,不是那么容易得到的。 的AppSettings一样的的applicationSettings这是在使用中的配置文件中的一个完全不同的部分。

您必须使用上面的挖掘方法或变体来获得在的applicationSettingsuserSettings。 此外, 的applicationSettings只会更新下一次启动该应用程序,如果你甚至可以给他们写信都在运行。

例如(从其他地方那儿剽窃 - 谢谢):

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;
    }

和另一个例子(许多例子adaoted - 谢谢你的世界):

///<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"));
    }

然后,不幸的是你还必须处理是在设置收集这些章节中的SettingElement对象。 每一个具有反序列化到属性类型,除非它是一个字符串例如用于的applicationSettings SettingElement(一个不能在运行时被动态更新):

(锻炼)

 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

所有这些例子摆弄的applicationSettings。 同样的方法也与userSettings工作与另外的可能是一些保存方法等,你也需要跟踪(或多或少),这几个许多配置文件实际上是在玩 - 主,漫游,或局部。

我为什么这样做呢? 由于两个相关的应用程序和一个共同的类库(或库)都需要使用其中的设置视觉管理的一个应用程序拥有相同的设置。 有没有人在一个更好的办法来解决呢?

谢谢。



Answer 3:

如果它是一个StringCollection你正试图从设置中提取

var strings = (StringCollection) Properties.Settings.Default["StpInsertSearchPath"];

将完成尽可能多的与出需要的XmlSerializer



Answer 4:

您连接字符串通常是配置管理器的ConnectionStrings财产的内部。 你应该能够通过它的静态方法更简单的方式来访问。

string myConnectionString = ConfigurationManager.ConnectionStrings["connectioStringName"];

我相信你应该使用标签“的AppSettings”而不是“的applicationSettings”中的config文件,以使ConfigurationManager中通过AppSettings属性来访问。

我不知道有足够的了解ConfigurationManager中是如何工作的,以确保这将解决你的问题,但它重命名和删除的自定义栏目组应该允许AppSettings的正常工作。

编辑是的,看来ConfigurationManager中的AppSettings属性访问在config文件命名的章节。



文章来源: Getting a StringCollection out of AppSettings through the configuration manager