0

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

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

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

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

如果我现在尝试通过: 访问此属性Settings.Default.ElemName,则构建失败并出现错误:'UTIL.Settings' is inaccessible due to its protection level

另一种方法是通过程序集中的帮助程序类使此属性可见UTIL

public String GetElemName()
{
  return Settings.Default.ElemName;
}

失败并出现:System.Configuration.dll 中发生“System.Configuration.ConfigurationErrorsException”...附加信息:配置系统初始化失败

我怎样才能让它运行?(我只需要阅读配置)

4

2 回答 2

0

最简单的方法如下:

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

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


示例:假设app.config您的 DLL 看起来像这样:

<?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 代码中,您将能够使用正常的配置设置机制,例如通过Properties.Settings.Default.AllowStartDLL 的代码或Properties.Settings.Default.LogPath应用程序的代码访问一个值。

你不能做的两件事:

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

顺便说一下,连接字符串也可以这样管理。我已经添加到上面的示例中。

于 2013-11-07T15:06:18.113 回答
0

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

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


如何共享配置:

  1. 项目(Business, DAO,UTIL等)-> 添加 -> 现有项目 -> 'Select' App.config -> 添加为链接
  2. 项目 -> 添加引用 -> .NET -> System.Configuration -> 确定
  3. string configValue = ConfigurationManager.AppSettings["token"];

App.config 文件的外观如下:

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

如果没有对现有 App.conifg 文件的此引用,AppSettings["token"]则在使用 NUnit 运行时将无法解析该值。如果应用程序在调试模式下启动,一切正常,即使没有用户提到的 App.config 链接Maarten

于 2013-11-20T16:58:59.683 回答