【问题标题】:How to read an App.Config of a different application in C#如何在 C# 中读取不同应用程序的 App.Config
【发布时间】:2015-04-17 00:33:31
【问题描述】:

我有一个用 C# 编写的控制台应用程序,它使用 app.config 文件。此应用程序旨在使用任务调度程序在服务器上运行。现在我想开发一个从 app.config 读取和写入的 UI。 (请注意,此配置并非旨在替换 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>

在查阅了几篇关于 stackoverflow 的文章后,我尝试了这个来打开文件并访问用户部分:

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

那么我在这里做错了什么?

非常感谢任何帮助或提示!

【问题讨论】:

  • 试试config.GetSectionGroup("userSettings")["AccessingConfigSample.Properties.Settings"]
  • 您也可以简单地将文件解析为任何 XML 文件...
  • @Crono:我想把它解析为 xml 文件,但我想把它留给 .net 的配置程序集。

标签: c# .net app-config


【解决方案1】:

您用作示例的配置文件使用ConfigurationSectionGroup,并且需要使用配置元素上的匹配方法GetSectionGroup而不是GetSection来读取这些文件

以下代码 sn -p 确实将 SectionGroup 的内容输出到 Debug 控制台:

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 以检索设置值(即 SettingElement)。

如果您将其与您提供的示例配置一起使用,则“调试输出窗口”窗格中的结果应该是:

ApplicationTitle=Accessing Config files
VersionNo=V 1.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2015-11-07
    • 2013-04-25
    • 1970-01-01
    • 2012-03-10
    • 2011-06-20
    相关资源
    最近更新 更多