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中的以下代码行引起的
上面显示的标记的属性类型具有以下含义(在这里解释:配置部分的部分元素):
在编写自定义配置节以处理集合项目时,我只定义了属性类型的前两个参数(完全限定的类名、程序集文件名)。Microsoft文档(不再维护)没有指定其他参数不能被定义,但是我和其他人使用的示例使用了这种方法。但是,重点是关于Microsoft文档中类型属性的以下短语:
The assembly file must be located in the same application directory
因此,由于这种绑定,似乎不可能使用这种方法处理来自另一个应用程序B(具有另一个程序集)的应用程序A的自定义部分。
你知道我怎么解决这个问题吗?
Windows服务-app.config1 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中查看/设置参数(自定义和非自定义):
通过这种方式,我可以处理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"/> |