如何在 C# 中读取不同应用程序的 App.Config
How to read an App.Config of a different application in C#
我有一个用 C# 编写的控制台应用程序,它使用 app.config 文件。此应用程序旨在 运行 使用任务计划程序的服务器上。现在我想开发一个 UI 来读写 app.config。 (请注意,此配置并非旨在替换 UI 应用程序的配置文件。)
但是我很难从文件中读取设置。使用 ConfigurationManager 我可以打开配置文件,但我无法访问配置设置。
这是 Visual Studio (2010) 生成的示例配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="AccessingConfigSample.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<userSettings>
<AccessingConfigSample.Properties.Settings>
<setting name="ApplicationTitle" serializeAs="String">
<value>Accessing Config files</value>
</setting>
<setting name="VersionNo" serializeAs="String">
<value>V 1.0</value>
</setting>
</AccessingConfigSample.Properties.Settings>
</userSettings>
</configuration>
在查阅了关于 Whosebug 的几篇文章后,我试过这样打开文件并访问用户部分:
if (File.Exists(configFile))
{
var configMap = new ExeConfigurationFileMap{ ExeConfigFilename = configFile};
var config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);
var userSection = config.GetSection("userSettings");
}
我也试过这个:
var userSection = config.GetSection("AccessingConfigSample.Properties.Settings");
两者都返回 null。
那么我做错了什么?
非常感谢任何帮助或提示!
您用作示例的配置文件在 Configuration 元素上使用 ConfigurationSectionGroup and those need to be read with the matching method GetSectionGroup 而不是 GetSection
以下代码片段将 SectionGroup 的内容输出到调试控制台:
if (File.Exists(configFile))
{
var configMap = new ExeConfigurationFileMap { ExeConfigFilename = configFile };
var config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);
// get the sectionGroup!
var userSectionGroup = config.GetSectionGroup("userSettings");
foreach (var userSection in userSectionGroup.Sections)
{
// check for a ClientSettingSection
if (userSection is ClientSettingsSection)
{
// cast from ConfigSection to a more specialized type
var clientSettingSect = (ClientSettingsSection) userSection;
foreach (SettingElement clientSetting in clientSettingSect.Settings)
{
Debug.WriteLine(String.Format("{0}={1}", clientSetting.Name, clientSetting.Value.ValueXml.InnerText ));
}
}
}
}
请注意,我将对象实例转换为 ClientSettingSection to retrieve the settings value (which is a SettingElement)。
如果您将它与示例配置一起使用,您在调试输出 Window 窗格中提供的结果应该是:
ApplicationTitle=Accessing Config files
VersionNo=V 1.0
我有一个用 C# 编写的控制台应用程序,它使用 app.config 文件。此应用程序旨在 运行 使用任务计划程序的服务器上。现在我想开发一个 UI 来读写 app.config。 (请注意,此配置并非旨在替换 UI 应用程序的配置文件。)
但是我很难从文件中读取设置。使用 ConfigurationManager 我可以打开配置文件,但我无法访问配置设置。
这是 Visual Studio (2010) 生成的示例配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="AccessingConfigSample.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<userSettings>
<AccessingConfigSample.Properties.Settings>
<setting name="ApplicationTitle" serializeAs="String">
<value>Accessing Config files</value>
</setting>
<setting name="VersionNo" serializeAs="String">
<value>V 1.0</value>
</setting>
</AccessingConfigSample.Properties.Settings>
</userSettings>
</configuration>
在查阅了关于 Whosebug 的几篇文章后,我试过这样打开文件并访问用户部分:
if (File.Exists(configFile))
{
var configMap = new ExeConfigurationFileMap{ ExeConfigFilename = configFile};
var config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);
var userSection = config.GetSection("userSettings");
}
我也试过这个:
var userSection = config.GetSection("AccessingConfigSample.Properties.Settings");
两者都返回 null。
那么我做错了什么?
非常感谢任何帮助或提示!
您用作示例的配置文件在 Configuration 元素上使用 ConfigurationSectionGroup and those need to be read with the matching method GetSectionGroup 而不是 GetSection
以下代码片段将 SectionGroup 的内容输出到调试控制台:
if (File.Exists(configFile))
{
var configMap = new ExeConfigurationFileMap { ExeConfigFilename = configFile };
var config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);
// get the sectionGroup!
var userSectionGroup = config.GetSectionGroup("userSettings");
foreach (var userSection in userSectionGroup.Sections)
{
// check for a ClientSettingSection
if (userSection is ClientSettingsSection)
{
// cast from ConfigSection to a more specialized type
var clientSettingSect = (ClientSettingsSection) userSection;
foreach (SettingElement clientSetting in clientSettingSect.Settings)
{
Debug.WriteLine(String.Format("{0}={1}", clientSetting.Name, clientSetting.Value.ValueXml.InnerText ));
}
}
}
}
请注意,我将对象实例转换为 ClientSettingSection to retrieve the settings value (which is a SettingElement)。
如果您将它与示例配置一起使用,您在调试输出 Window 窗格中提供的结果应该是:
ApplicationTitle=Accessing Config files
VersionNo=V 1.0