【发布时间】:2017-02-17 08:12:43
【问题描述】:
ConfigurationManager.OpenExeConfiguration(string exePath) 的 documentation 声明:
将指定的客户端配置文件作为配置打开 对象。
它还指出exePath 是“可执行(exe)文件的路径”
该方法应该在exePath指定的路径打开可执行文件的*.exe.config文件,如果“无法加载配置文件”将抛出ConfigurationErrorsException。
以下代码使用非可执行文件的路径,并且该路径的目录不包含 *.exe.config 文件。然而,代码执行时没有任何异常,也没有任何其他无效参数的迹象。
var configs = Directory.GetFiles("C:\\NoConfig", "*.config");
Debug.Assert(configs.Length == 0);
File.WriteAllText("C:\\NoConfig\\notes.txt", "This is not an executable, and there is no .config file in its folder.");
var config = ConfigurationManager.OpenExeConfiguration("c:\\notes.txt");
Debug.Assert(config != null);
然而,它现在将慢慢地被新的基于 .NET Core JSON 的配置弃用,并且无论如何都不会被审查或修复。
那么,这是由于 OpenExeConfiguration 方法的重载中的错误造成的吗?
在我在 MS Connect 上提出之前,我只是想要第二次也是 n 的意见。目前 Connect 已关闭。
添加:如果我用有效的exePath 调用OpenExeConfiguration 到一个真正的可执行文件(经过测试),并带有一个有效的.config 文件,那么它会读取但不解析文件.我必须为appSettings 部分请求xml 并自己解析它,使用此答案对AppSettings from custom files 的解决方法。这增加了我的怀疑,即此代码在此模式下不常用,已被接受为有效且未经审查,因此可能存在错误。
我敢肯定,新的 .NET Core 配置 API 只替换旧的 XML 配置 API 会引起很少的关注。
【问题讨论】:
-
它是开源的,所以检查代码看它是否是设计使然。 referencesource.microsoft.com/#System.Configuration/System/…
-
@LexLi 我很想查看源代码,感谢提供链接,但如果它是设计使然,(a)它没有意义,并且(b)它应该被记录在案按照设计。事实上,我正在下载整个该死的框架,它只有 59MB。
-
.exe 没有.config 文件是完全正常的。所以,如果它按照你的想法工作,你怎么能用这个 api 创建一个呢?只需正确阅读说明:“无法加载” == 找到该文件,但其中包含乱码。功能,而不是错误。
-
@HansPassant,如果 .exe 没有 .config 文件,那么所讨论的方法肯定会以某种方式通知我。毕竟,文档让我理所当然地认为 .config 已被读取,并且我的代码可能会基于假设配置元素不存在而做出错误的决定。请参阅我的编辑,以了解更多错误行为。使用 .NET Core!
标签: c# .net configurationmanager .net-4.6 defects