关于C#:使用app.config,在两个不同的项目之间共享自定义节

Use App.config with a Custom Section shared between two different projects

脚本

我开发了一个由app.config文件配置的Windows服务。此文件包含标准节(ConnectionStrings、AppSettings)和自定义节(SourceTabSection)中的信息。在Windows服务项目中,我有4个类,它们允许我获取/设置配置文件内容。它们基于本文中所写的内容:编写一个自定义配置节来处理一个集合,并且在我的服务中使用它们没有问题。当我尝试获取/设置属于Windows服务的app.config的自定义部分(标准部分我没有任何问题)时,会出现问题,使用另一个应用程序,在我的情况下,它是一个Windows窗体,允许用户查看/设置Windows服务的参数。为了处理app.config,Windows窗体应用程序具有由服务使用的4个类组成的相同包。当在Windows窗体应用程序上执行获取/设置Windows服务自定义参数的代码时,我会收到以下错误消息:

{"An error occurred creating the configuration section handler for sourceTabSection: Could not load type 'DataReportingService.CustomSourceTabSection.SourceTabSection' from assembly 'DataReportingService'."}

问题是由于app.config中的以下代码行引起的

上面显示的标记的属性类型具有以下含义(在这里解释:配置部分的部分元素):

type="Fully qualified class name, assembly file name, version, culture, public key token"

在编写自定义配置节以处理集合项目时,我只定义了属性类型的前两个参数(完全限定的类名、程序集文件名)。Microsoft文档(不再维护)没有指定其他参数不能被定义,但是我和其他人使用的示例使用了这种方法。但是,重点是关于Microsoft文档中类型属性的以下短语:

The assembly file must be located in the same application directory

因此,由于这种绑定,似乎不可能使用这种方法处理来自另一个应用程序B(具有另一个程序集)的应用程序A的自定义部分。

你知道我怎么解决这个问题吗?

Windows服务-app.config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="sourceTabSection" type="DataReportingService.CustomSourceTabSection.SourceTabSection, DataReportingService"/>  
  </configSections>

  <!-- *** CUSTOM SECTION *** -->
  <sourceTabSection>
    <Tables>
      <sourceTab name="TEST" db_conn_str="****"
        keep_time="1" scan_frequency_process_rows="1"
        scan_frequency_delete_processed_rows="1" />
      <sourceTab name="TEST_2" db_conn_str="****"
        keep_time="1" scan_frequency_process_rows="1"
        scan_frequency_delete_processed_rows="1" />
    </Tables>
  </sourceTabSection>

  <!-- *** STANDARD SECTIONS *** -->

  <connectionStrings>
    <add name="DB_Target" connectionString="Data Source=192.168.2.2;Initial Catalog=PlantDompe;Persist Security Info=True;User ID=sa;Password=Gf6swML0MXiqbOFuvRDvdg==;"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

 
   
   
   
   
  </appSettings>

<startup>
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
</startup>
<system.web>
    <trust level="Full" />
    <webControls clientScriptsLocation="/aspnet_client/{0}/{1}/" />
</system.web>
</configuration>

丑陋的解决方案

如果通过在Windows窗体应用程序上执行以下两个步骤找到解决此问题的方法,这些步骤需要在Windows服务的app.config中查看/设置参数(自定义和非自定义):

  • 使用Visual Studio,我转到解决方案属性>应用程序选项卡,然后更改以下值程序集名称=DataReportingService默认命名空间=DataReportingService注意:datareportingservice是具有app.config文件的窗口服务的名称。
  • 查找旧名称空间的所有引用并用新名称空间替换
  • 通过这种方式,我可以处理app.config的自定义部分,但老实说,这是一个非常糟糕的解决方案,我认为应该有更好的解决方案。


    谢谢@alex paven,您的评论帮助我解决了这个问题!下面是我所做工作的详细步骤:

  • 我移动了4个类来处理类库项目(.NET框架)中的Windows服务配置文件:drs_customconfig。

  • 我用以下值更改了4个类的名称空间:drs_customconfig,然后编译了项目。

  • 我在Windows服务项目和Windows窗体应用程序中链接了外部库

  • 对于需要使用外部库中包含的类的两个项目的每个类,我插入了以下代码:

    1
    using DRS_CustomConfig;
  • 在Windows服务的app.config中,我更改了section元素,如下所示:

  • 旧的

    1
    2
    3
            <section name="sourceTabSection"
        type="DataReportingService.CustomSourceTabSection.SourceTabSection,
        DataReportingService"
    />

    新的

    1
    2
            <section name="sourceTabSection"
        type="DRS_CustomConfig.SourceTabSection, DRS_CustomConfig"/>