从DLL访问app.config

时间:2017-02-17 15:01:43

标签: c# app-config

我已阅读this post from Marc Gravell,了解如何从DLL中读取app.config - 文件。当我尝试从该库中读取userSettings时,我得到一个空列表:

var settings = ConfigurationManager.OpenExeConfiguration("CodeGeneratorApp.exe").AppSettings.Settings;

app.config - 文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="CodeGenerator.CodeGeneratorApp.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <userSettings>
        <CodeGenerator.CodeGeneratorApp.Properties.Settings>
          <setting name="CodeExtensions" serializeAs="Xml">
            <value>
              <CodeExtensionList>
                <Extension AssemblyQualifiedName="CodeGenerator.Extensions.NamespaceTypesExtension, CodeGenerator, Culture=neutral">
                  <NamespaceTypesExtension />
                </Extension>
                ...
              </CodeExtensionList>
            </value>
          </setting>
        </CodeGenerator.CodeGeneratorApp.Properties.Settings>
    </userSettings>
</configuration>

我的DLL和应用程序位于同一文件夹中,即使我添加

var settings = ConfigurationManager.OpenExeConfiguration("CodeGeneratorApp.exe").AppSettings.Settings;

到QuickWatch我看到返回对象的FilePath被设置为应用程序配置文件,因此找到并正确打开它。

特别是我想要实现的是对value的{​​{1}}反序列化,但我不知道如何在文件中访问该部分。

2 个答案:

答案 0 :(得分:1)

好像你已经要求了。 app.config中没有appSettings部分。这就是AppSettings.Settings返回空列表的原因。

修改

您似乎正在尝试加载自定义部分CodeGenerator.CodeGeneratorApp.Properties.Settings。如果是这种情况,以下代码应该完成工作:

var settings = ConfigurationManager
    .OpenExeConfiguration("CodeGeneratorApp.exe")
    .GetSection("userSettings/CodeGenerator.CodeGeneratorApp.Properties.Settings")

答案 1 :(得分:0)

我终于在klashar的帮助下得到了它。由于信息位于userSettings内,我们需要查询此特定部分。这可以通过以下代码完成:

var config = ConfigurationManager.OpenExeConfiguration("CodeGeneratorApp.exe");
var sectionGroup = (ClientSettingsSection) config.GetSection("userSettings/CodeGenerator.CodeGeneratorApp.Properties.Settings");

现在我们可以获得该组中的SettingElement,在我的情况下只有一个,所以我们可以采取第一个,查询其内容为Xml,将该Xml写入MemoryStream和反序列化该流:

var setting = (SettingElement) sectionGroup.Settings[0];

var ser = new XmlSerializer(typeof(CodeExtensionList));
MemoryStream stm = new MemoryStream(); 
StreamWriter stw = new StreamWriter(stm);
stw.Write(setting.Value.ValueXml.InnerXml);
stw.Flush();
stm.Position = 0;
var value = ser.Deserialize(stm) as CodeExtensionList;