如何为引用的ClassLibraires(Assebmlies)显示App.config值

时间:2013-11-07 14:50:12

标签: c# .net app-config

我有一个名为Application的C#项目,它基本上被认为代表了最顶层的应用程序层。所有其他图层都被视为类似图书馆,如BUSINESSDAOUTIL。现在我希望可以使用 App.config 文件配置应用程序。为此,我需要为引用的ClassLibraries(程序集)使这个配置文件可见。

对我来说,最合适的解决方案是UTIL程序集可以访问App.config并能够将这些可访问的项共享给上层应用程序。

到目前为止,我尝试在UTIL程序集中创建一个 Settings.settings 文件,该文件定义了一个项目:Name: ElemName; Type: String; Scope: Application。位于Application程序集中的 App.config 文件包含以下来源:

<applicationSettings>
  <UTIL.Settings>
    <setting name="ElemName" serializesAs="String">
      <value>SomeValue</value>
    </setting>
  </UTIL.Settings>
</applicationSettings>

如果我现在尝试通过Settings.Default.ElemName访问此媒体资源, 构建失败并显示错误:'UTIL.Settings'由于其保护级别而无法访问

另一种方法,通过程序集UTIL

中的帮助程序类使该属性可见
public String GetElemName()
{
  return Settings.Default.ElemName;
}

在System.Configuration.dll中发生:'System.Configuration.ConfigurationErrorsException'失败...其他信息:配置系统无法初始化

如何让它运行? (我只需要阅读配置)

2 个答案:

答案 0 :(得分:0)

最简单的是:

在DLL程序集的项目属性中添加所需的设置,就像对任何普通应用程序一样。

现在,DLL实际上并没有读取自己的app.config。诀窍是将整个<applicationSettings>块从DLL app.config复制到应用程序的app.config,并在文件顶部的<sectionGroup>部分添加相应的行。


示例:假设您的DLL的app.config如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="DLLSample.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>

    <connectionStrings>
        <add name="DLLSample.Properties.Settings.MyConnectionString" connectionString="Data Source=..." providerName="System.Data.SqlClient" />
    </connectionStrings>

    <applicationSettings>
        <DLLSample.Properties.Settings>
            <setting name="AllowStart" serializeAs="String">
                <value>True</value>
            </setting>
        </DLLSample.Properties.Settings>
    </applicationSettings>
</configuration>

您的应用程序的app.config如下所示:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="App.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>

  <applicationSettings>        
    <App.Properties.Settings>
      <setting name="LogPath" serializeAs="String">
        <value>C:\Temp</value>
      </setting>
    </App.Properties.Settings>
  </applicationSettings>
</configuration>

完成上述更改后,应用程序的配置文件应如下所示:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="App.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
      <section name="DLLSample.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>

  <connectionStrings>
      <add name="DLLSample.Properties.Settings.MyConnectionString" connectionString="Data Source=..." providerName="System.Data.SqlClient" />
  </connectionStrings>

  <applicationSettings>        
    <App.Properties.Settings>
      <setting name="LogPath" serializeAs="String">
        <value>C:\Temp</value>
      </setting>
    </App.Properties.Settings>
    <DLLSample.Properties.Settings>
        <setting name="AllowStart" serializeAs="String">
            <value>True</value>
        </setting>
    </DLLSample.Properties.Settings>
  </applicationSettings>
</configuration>

从您的应用程序和DLL代码中,您将能够使用常规配置设置机制,例如通过DLL代码中的Properties.Settings.Default.AllowStart访问值或从应用程序代码访问Properties.Settings.Default.LogPath

你不能做的两件事:

  1. 从应用程序访问DLL配置值,反之亦然
  2. 从应用程序的属性页面管理DLL配置值。您需要手动编辑app.config以添加/删除/修改设置。

  3. 顺便说一句,连接字符串也可以通过这种方式进行管理。我已经添加了上面的例子。

答案 1 :(得分:0)

我以不同的方式解决了这个问题。

名为Application的项目仍包含App.config文件。所有引用的程序集(BusinessDAOUTIL和TestAssemblies)只共享应用程序配置。


如何分享配置:

  1. 项目(BusinessDAOUTIL等) - &gt;添加 - &gt;现有项目 - &gt; '选择'App.config - &gt;添加为链接
  2. 项目 - &gt;添加参考 - &gt; .NET - &gt; System.Configuration - &gt;行
  3. string configValue = ConfigurationManager.AppSettings["token"];

  4. App.config文件的外观如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    ...
      <appSettings>
        <add key="token" value="ConfigValue" />
      </appSettings>
    ...
    </configuration>
    

    如果没有对现有App.conifg文件的引用,{I}在运行NUnit时将无法解析该值。如果应用程序是在调试模式下启动的,那么一切正常,即使没有用户 AppSettings["token"]

    提到的App.config链接