我开发了一个由其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的自定义部分。
所以你知道我怎么能解决这个问题?
<?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中查看/设置参数(自定义和无自定义):
通过这种方式,我可以处理App.config的自定义部分,但说实话,这是一个非常难看的解决方案,我认为应该有更好的东西。
答案 0 :(得分:1)
感谢@Alex Paven,您的评论帮助我解决了这个问题! 下面是我所做的详细步骤:
我在名为:DRS_CustomConfig的类库项目(.NET Framework)中移动了处理Windows服务配置文件的4个类。
我使用以下值更改了4个类的命名空间: DRS_CustomConfig 然后我编译了项目。
我在Windows服务项目和Windows窗体应用程序中链接了外部库
对于需要使用外部库中包含的类的两个项目的每个类,我插入了以下代码:
using DRS_CustomConfig;
在Windows服务的App.config中,我更改了section元素,如下所示:
<section name="sourceTabSection"
type="DataReportingService.CustomSourceTabSection.SourceTabSection,
DataReportingService"/>
<section name="sourceTabSection"
type="DRS_CustomConfig.SourceTabSection, DRS_CustomConfig"/>