C#ConfigurationManager多个配置⽂件读取问题
之前写了篇的⽂章,后来在实际使⽤过程中,将⼀些需要修改的参数顺⼿就写到了配置⽂件fig⾥⾯。然后直接F5运⾏项⽬,想着调试下看看程序是否正常运⾏,这⼀试就试出问题了,ConfigurationManager.AppSettings.Get("message")获取不到参数。
ConfigurationManager
ConfigurationManager是⼀个提供对客户端应⽤程序配置⽂件访问的静态类,此类不能被继承。使⽤此类需要先将
System.Configuration.dll引⽤到项⽬中来,具体的使⽤⽅式建议查看。
回顾⼀下上⽂项⽬的⽬录结构,在⼀个解决⽅案中有两个项⽬分别为TaskWindowsService(Windows服务项⽬)和WindowsServiceClient(服务管理winform程序)。他们都有各⾃的fig⽂件。
接下来我们做⼀个测试:
1. 各个项⽬的fig中分别添加如下代码
<appSettings>
<add key="message" value="this is TaskWindowsService"/>
</appSettings>
<appSettings>
六一儿童节发朋友圈怎么说<add key="message" value="this is WindowsServiceClient"/>
</appSettings>
ps:(两个配置⽂件都有了,总不⾄于读不到数据了吧~)
2. 在TaskWindowsService中引⽤System.Configuration.dll,并使⽤ConfigurationManager读取配置⽂件,记录到⽇志中
public static void ConfigTest()
{
LogHelper.Log(ConfigurationManager.AppSettings.Get("message"));
}
3. 运⾏WindowsServiceClient并调⽤ConfigTest()⽅法
public Form1()
{
InitializeComponent();
小孩放风筝图片SkpDomain.ConfigTest();
}
4. 注册并启动TaskWindowsService在服务启动时调⽤ConfigTest()⽅法
protected override void OnStart(string[] args)
{
电脑无法识别usbSkpDomain.ConfigTest();
}
看⼀下输出的⽇志,好玩的东西来了。居然两个fig⽂件都光顾到了。从顺序来看,先打开读取的是WindowsServiceClient的配置⽂件,再是TaskWindowsService启动时读取的配置⽂件。
{"Time":"2020-10-28 17:38:55","Message":"this is WindowsServiceClient","Data":null}
{"Time":"2020-10-28 17:38:57","Message":"this is TaskWindowsService","Data":null}
从这⾥可以得出⼀个结论:ConfigurationManager读取的配置⽂件是由当前运⾏的项⽬决定的
这⾥引⽤⼀段
1. fig
作为开发时配置参数的⽂件,可以在vs开发时右键属性设置是否复制到可执⾏程序同⽬录下(默认始终不复制)。
在不复制的情况下,编译⽣成可执⾏程序时会copy该⽂件为.fig⽂件和.fig⽂件。
这样的话,在/bin/debug/ 或者/bin/release/⽬录下就不会有fig⽂件了,对应的有fig和fig。
以后运⾏exe⽂件所操作的配置⽂件(通过System.Configuration对象,
System.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None))直接修改的是fig⽂件。
2.*.fig
vs调试编译时,如果fig⽂件有修改,则会重新copy覆盖到fig和fig⽂件中,
否则fig不会改变。fig⽂件为程序实际运⾏时(直接运⾏.exe程序)直接操作的配置⽂件。搞笑电影大全国语版
3.*.fig
该⽂件主要是在vs调试运⾏时起作⽤,在调试运⾏程序时(* -> *.exe)先copy *.fig覆盖
*.fig,然后运⾏程序时操作的配置⽂件为 .fig。在调试程序结束时(.exe -> *.)再次copy
.fig覆盖.fig。所以调试情况下⽆论怎么修改配置⽂件,程序退出后都不会修改配置⽂件(还原了)。破坏环境的例子
如果⼀定要强⾏指定获取某⼀个程序的配置⽂件,可以这么做:
public static void ConfigTest()
{
var servicePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "");//⼀定是运⾏程序路径,⽽不是配置⽂件路径 LogHelper.Log(ConfigurationManager.OpenExeConfiguration(servicePath).AppSettings.Settings["message"].Value);瞬杀特性
}
总结
问题不⼤,这个坑以前也踩过,但是没有仔细的研究背后的原因,只是在两个配置⽂件中都写了⼀样的参数,事情过了也就忘了。这次重新遇到就好好记录⼀下,以后可不能再踩坑了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论