我访问这样我组装的配置:
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。 在哪里可以找到我的字符串集合?
你应该使用这个简单的语法是访问集合中的项
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);
}
有可能是一个更短的路,但是这对我的作品。
的AppSettings和的ConnectionStrings直接可在ConfigurationManager中两个属性。
然而,和的applicationSettings userSettings,对应于你可以在VS设置设计编辑的熟悉Settings.settings,不是那么容易得到的。 的AppSettings是不一样的的applicationSettings这是在使用中的配置文件中的一个完全不同的部分。
您必须使用上面的挖掘方法或变体来获得在的applicationSettings和userSettings。 此外, 的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工作与另外的可能是一些保存方法等,你也需要跟踪(或多或少),这几个许多配置文件实际上是在玩 - 主,漫游,或局部。
我为什么这样做呢? 由于两个相关的应用程序和一个共同的类库(或库)都需要使用其中的设置视觉管理的一个应用程序拥有相同的设置。 有没有人在一个更好的办法来解决呢?
谢谢。
如果它是一个StringCollection你正试图从设置中提取
var strings = (StringCollection) Properties.Settings.Default["StpInsertSearchPath"];
将完成尽可能多的与出需要的XmlSerializer
您连接字符串通常是配置管理器的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