标题:改变 Configuration File为其他配置文件
版本:Enterprise Library June 2005
问题:我知道 ConfigurationManager 缺省使用的配置文件是应用程序配置文件。假设我做了个dll,名字是BookingUIP.dll,它使用ConfigurationManager和Tracer(Logging Block内的对象)来读取参数和记录跟踪信息。如果我做一个WindowsFormsUI.exe来调用BookingUIP.dll,那么BookingUIP.dll缺省会读取WindowsFormsUI.exe.config配置文件。由于WindowsFormsUI.exe.config是我控制的,这不会出现什么问题。
但是,当我用NUnit 的nunit-gui.exe来调用 BookingUIP.dll的时候,BookingUIP.dll缺省会使用nunit-gui.exe.config来作为自己的配置文件。
现在,我的问题时,如何使BookingUIP.dll引用的所有Application Block,都缺省读取 BookingUIP.dll.config,而不是nunit-gui.exe.config或者WindowsFormsUI.exe.config。
我找来找去,发现没有办法,只好在ConfigurationManager内增加个SetConfigurationFile函数,把BookingUIP.dll.config文件全路径传给它,并且修改ConfigurationManager的缺省构造函数,让它使用我传入的配置文件名。
当然,这肯定不是最好的办法,不知道各位高手有什么好办法?
***********************************相关代码*********************
**********************************
1.BookingUIP.dll
我的BookingUIP.dll是从 BookingUIP.cs生成的,代码很简单:
















当然,编译成BookingUIP.dll的时候要引用EntLlib的Common,Configuration,Data 3个dll.
2.BookingUIP.dll.config和dataconfiguration.config
然后使用EntLibConfig.exe生成BookingUIP.dll.config和dataconfiguration.config.
3.WinFormApp1.exe
再做一个简单的WinForm程序,来调用 BEClass1的 GetDatabase方法:
WinFormApp1.cs:































从WinFormApp1.cs生成WinFormApp1.exe,要引用EntLlib的Common,Configuration,Data 3个dll.
4.测试结果
4.1 如果 WinFormApp1.exe.config不存在,那么btnGetDatabase_Click会报告
---------------------------
Current Configuration File is C:\WINNT\Microsoft.NET\Framework\v2.0.50727\Config\machine.config
---------------------------
然后db = be.GetDatabase();失败:
---------------------------
Invalid section name. The section 'dataConfiguration' does not exist in the requested configuration file 'G:\..\WinFormApp1.exe.config' or the file 'C:\WINNT\Microsoft.NET\Framework\v2.0.50727\Config\machine.config'. Make sure that the 'enterpriseLibrary.configurationSections' configuration section exists in one of the files and that the section 'dataConfiguration' is defined.
---------------------------
4.2如果WinFormApp1.exe.config存在,但是没有dataConfiguration配置块,那么btnGetDatabase_Click会报告
---------------------------
Current Configuration File is G:\..\WinFormApp1.exe.config
---------------------------
然后db = be.GetDatabase();失败:
---------------------------
Invalid section name. The section 'dataConfiguration' does not exist in the requested configuration file 'G:\..\WinFormApp1.exe.config' or the file 'C:\WINNT\Microsoft.NET\Framework\v2.0.50727\Config\machine.config'. Make sure that the 'enterpriseLibrary.configurationSections' configuration section exists in one of the files and that the section 'dataConfiguration' is defined.
---------------------------
4.3如果WinFormApp1.exe.config存在,并且dataConfiguration配置正确,
那么db = be.GetDatabase();会成功。
在以上三种情况下,BookingUIP.dll.config和dataconfiguration.config始终存在,并且BookingUIP.dll.config正确连接到dataconfiguration.config.
我的问题是,如何能让 WinFormApp1.exe调用BookingUIP.dll的方法,同时BookingUIP.dll内面的Enterprise Library代码(包括Tracer)都引用BookingUIP.dll.config作为自己的配置文件,而不是WinAppForm1.exew.config?