再谈额外的配置文件读取和ConfigrationManager.OpenExeConfiguration(exePath)的误导性错误
2008-07-15 12:18
369 查看
前两天有人在我的blog上问关于额外的配置文件的读取的问题,可惜的是我的这篇blog已经是1年前写的了,而且我也1年没有再摸编程了,先在断网的情况下在msdn本地库里试了一晚上,没有结果,今天早上在网上搜了搜,发现也有人遇到这样的问题,最终我发现了msdn的对此问题的误导性错误,与大家分享一下.
----------------------------------------------------------------------------------------------
首先说ConfigrationManager.OpenExeConfiguration(exePath)的问题:
1.此处是一个bug,exePath在msdn的说明中是要读取的配置文件的路径,而在生成System.Configuration.Configuration a = System.Configuration.ConfigurationManager.OpenExeConfiguration(exepath)的时候,实际在生成的a对象中,可以看到它的FilePath属性,让人大吃一惊,它显示的路径是原exePath路径+.config.
所以a对象中永远为空,因为你的X.config是存在的,但它读取的却是X.config.config.
这是否是我们的理解有误而非Bug呢?
不,在试验在exePath中填写.config前面的部分后,提示错误,无法读取该配置文件,即它的ConfigurationManager.OpenExeConfiguration()方法要求exepath必须是一个.config文件!!!
2.这个Bug可能的原因
我猜想,它原来的读取的方法和类都是针对的配置文件的形式为:可执行文件文件名+.exe+.config的形式,或者是Machine.config.而这时不需要识别.config的,而当在.net 2.0里面时候,添加的这个读取额外配置文件的方法,由于一些失误,仍然是匹配的原来的老方法,导致它在读取是自动加上了.config.
---------------------------------------------------------------------------------------------
解决方法
我参考了<Configuration类在网页实现对web.config的修改>(http://tech.sina.com.cn/s/2008-06-30/1013712947.shtml)的方法
即真假config文件的方法:
1.先在项目的bin/debug目录下建立一个额外的config文件,即X.config;
2.在同目录下建立一个X.config.config文件;
3.所有信息都在X.config.config内,即appSettings节点等;
4.然后读写都可以了.
-----------------------------------------------------------------------------------------------
我写的一个小例子:
1.读取配置文件信息的代码
//配置文件的路径,此处为配置文件(假)的路径
string path=Application.StartupPath+"\\App2.1.config";
//显示结果,即配置文件的MachineID字段的值
string showContent = "";
//a对象从额外的配置文件(真)生产,而exepath,即path填写的是配置文件(假)的路径,而配置文件(真)的路径=配置文件(假)的路径+.config;而配置文件(假)的文件名中,最后也应是.config结尾.
System.Configuration.Configuration a = System.Configuration.ConfigurationManager.OpenExeConfiguration(path);
//如果配置文件中不包括appSettings节,则抛出异常.
if (a.Sections["appSettings"] == null)
else
//Label显示配置文件中的MachineID的值
label1.Text = showContent;
2.配置文件名称:App2.1.config.config
内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="MachineID" value="App2.1 Long"/>
</appSettings>
</configuration>
3.最后读取出的结果显示在label中,为:App2.1 Long
其实这是很无奈的方法.
--------------------------------------------------------------------
参考: 1.<Configuration类在网页实现对web.config的修改> http://tech.sina.com.cn/s/2008-06-30/1013712947.shtml;
2.<郁闷的 ConfigurationManager> http://www.cnblogs.com/drizzlecrj/archive/2007/04/04/697146.html;
3.http://msdn.microsoft.com/zh-cn/ms224437(VS.80).aspx;
----------------------------------------------------------------------------------------------
首先说ConfigrationManager.OpenExeConfiguration(exePath)的问题:
1.此处是一个bug,exePath在msdn的说明中是要读取的配置文件的路径,而在生成System.Configuration.Configuration a = System.Configuration.ConfigurationManager.OpenExeConfiguration(exepath)的时候,实际在生成的a对象中,可以看到它的FilePath属性,让人大吃一惊,它显示的路径是原exePath路径+.config.
所以a对象中永远为空,因为你的X.config是存在的,但它读取的却是X.config.config.
这是否是我们的理解有误而非Bug呢?
不,在试验在exePath中填写.config前面的部分后,提示错误,无法读取该配置文件,即它的ConfigurationManager.OpenExeConfiguration()方法要求exepath必须是一个.config文件!!!
2.这个Bug可能的原因
我猜想,它原来的读取的方法和类都是针对的配置文件的形式为:可执行文件文件名+.exe+.config的形式,或者是Machine.config.而这时不需要识别.config的,而当在.net 2.0里面时候,添加的这个读取额外配置文件的方法,由于一些失误,仍然是匹配的原来的老方法,导致它在读取是自动加上了.config.
---------------------------------------------------------------------------------------------
解决方法
我参考了<Configuration类在网页实现对web.config的修改>(http://tech.sina.com.cn/s/2008-06-30/1013712947.shtml)的方法
即真假config文件的方法:
1.先在项目的bin/debug目录下建立一个额外的config文件,即X.config;
2.在同目录下建立一个X.config.config文件;
3.所有信息都在X.config.config内,即appSettings节点等;
4.然后读写都可以了.
-----------------------------------------------------------------------------------------------
我写的一个小例子:
1.读取配置文件信息的代码
//配置文件的路径,此处为配置文件(假)的路径
string path=Application.StartupPath+"\\App2.1.config";
//显示结果,即配置文件的MachineID字段的值
string showContent = "";
//a对象从额外的配置文件(真)生产,而exepath,即path填写的是配置文件(假)的路径,而配置文件(真)的路径=配置文件(假)的路径+.config;而配置文件(假)的文件名中,最后也应是.config结尾.
System.Configuration.Configuration a = System.Configuration.ConfigurationManager.OpenExeConfiguration(path);
//如果配置文件中不包括appSettings节,则抛出异常.
if (a.Sections["appSettings"] == null)
else
//Label显示配置文件中的MachineID的值
label1.Text = showContent;
2.配置文件名称:App2.1.config.config
内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="MachineID" value="App2.1 Long"/>
</appSettings>
</configuration>
3.最后读取出的结果显示在label中,为:App2.1 Long
其实这是很无奈的方法.
--------------------------------------------------------------------
参考: 1.<Configuration类在网页实现对web.config的修改> http://tech.sina.com.cn/s/2008-06-30/1013712947.shtml;
2.<郁闷的 ConfigurationManager> http://www.cnblogs.com/drizzlecrj/archive/2007/04/04/697146.html;
3.http://msdn.microsoft.com/zh-cn/ms224437(VS.80).aspx;
相关文章推荐
- C# winform配置文件读取和ConfigrationManager.OpenExeConfiguration(exePath)的误导性错误
- 与大家再讨论ConfigurationManager.OpenExeConfiguration(exePath)的问题
- vs2005读取配置文件错误System.Configuration.ConfigurationSettings.AppSettings”已过时
- ConfigurationManager.AppSettings["XXX"] 读取配置文件
- 2.工厂BeanFactory类,读取工厂配置文件的数据,创建Dao对象,Manager对象
- "IIS7.5 HTTP 错误 500.19 由于权限不足而无法读取配置文件"的解决。
- 配置文件读取类:commons-configuration使用
- 郁闷的 ConfigurationManager.OpenExeConfiguration
- IIS配置错误由于权限不足而无法读取配置文件的解决办法
- C# 获取网关地址 读取配置文件 打开关闭exe
- 配置安装Apache主服务发生错误:"(OS 5)拒绝访问。 : AH00369: Failed to open the Windows service manager, perh······ "
- c#Process.Start (exe)无法读取配置文件
- Grassroots Groovy: Configuration with ConfigSlurper JAVA读取groovy配置文件(Config.groovy)
- java中读取配置文件的方法fileSystemXmlapplicationContext与classPathXmlApplicationContext
- spring mvc框架 web.xml配置文件 Could not open ServletContext resource [/WEB-INF/classes/spring-servlet.xml] 错误
- C# 读取app.config配置文件 节点键值,提示 "配置系统未能初始化" 错误的解决方案
- NHibernate学习(三)读取配置文件-Configuration
- jar包读取配置文件找不到错误
- [dotNET]如何利用ConfigurationSettings.AppSettings.GetValues读取配置文件中多个同Key的value
- C# 读取app.config配置文件 节点键值,提示 "System.TypeInitializationException 类型初始值设定项引发异常" 错误的解决方案