将App.config与两个不同项目

时间:2017-07-11 10:15:23

标签: c# .net windows app-config

方案

我开发了一个由其App.config文件配置的Windows服务。 此文件包含标准部分( connectionStrings appSettings )和自定义部分( sourceTabSection )中的信息。
在Windows服务项目中,我有4个类,允许我获取/设置配置文件内容。它们基于本文中的内容:Writing a Custom ConfigurationSection to handle a Collection,我在服务中使用它们没有任何问题。

当我尝试获取/设置App.config的自定义部分(标准部分我没有任何问题)属于Windows服务,使用另一个应用程序(在我的情况下是Windows)时出现问题允许用户查看/设置Windows服务参数的表单 Windows窗体应用程序具有服务使用的4个类的相同包,以便处理App.config。 当获取/设置Windows服务的自定义参数的代码在Windows窗体应用程序上执行时,我收到以下错误消息:

  

{"为sourceTabSection创建配置节处理程序时出错:无法加载类型' DataReportingService.CustomSourceTabSection.SourceTabSection'来自汇编' DataReportingService'。"}

问题是由App.config中的以下代码行

引起的

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

上面显示的代码的属性类型具有以下含义(此处说明:section Element for configSections):

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

按照编写自定义ConfigurationSection来处理集合文章的内容,我只定义了属性类型的前两个参数(完全限定类名,汇编文件名)。 Microsoft文档(不再维护)没有指定其他参数可以不定义,但我遵循的示例和其他人使用此方法。 但关键是关于Microsoft文档中的type属性的这句话:

  

程序集文件必须位于同一个应用程序目录中

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

所以你知道我怎么能解决这个问题?

Windows服务 - App.config

<?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>
    <add key="TAB_ALARMS_TARGET" value="AlarmsProcess" />
    <add key="TAB_VALUE_TARGET" value="USER_CHANGES" />
    <add key="TAB_LOGINS_TARGET" value="USER_LOGONS" />
    <add key="LOG_DIR" value="C:/Users/rossi/Documents/Visual Studio 2017/Projects/DRS_proj/Log/" />
  </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中查看/设置参数(自定义和无自定义):

  1. 使用visual studio我去解决方案属性&gt;应用程序选项卡,我更改以下值
    程序集名称= DataReportingService
    默认名称空间= DataReportingService

    注意: DataReportingService是带有App.config文件的窗口服务的名称
  2. 使用新的命名空间
  3. 查找并替换对旧命名空间的所有引用

    通过这种方式,我可以处理App.config的自定义部分,但说实话,这是一个非常难看的解决方案,我认为应该有更好的东西。

1 个答案:

答案 0 :(得分:1)

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

  1. 我在名为:DRS_CustomConfig的类库项目(.NET Framework)中移动了处理Windows服务配置文件的4个类。

  2. 我使用以下值更改了4个类的命名空间: DRS_CustomConfig 然后我编译了项目。

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

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

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

  6.         <section name="sourceTabSection" 
        type="DataReportingService.CustomSourceTabSection.SourceTabSection, 
        DataReportingService"/>
    

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