这真的是ConfigurationManager.OpenExeConfiguration的错误吗?

时间:2016-10-08 12:22:42

标签: c# .net configurationmanager .net-4.6 defects

ConfigurationManager.OpenExeConfiguration(string exePath)州的documentation

  

将指定的客户端配置文件作为配置打开   对象

它还声明exePath是"可执行文件(exe)文件的路径"

该方法应该在*.exe.config指定的路径上打开可执行文件的exePath文件,并且如果"配置文件可能会抛出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目前正在下降。

已添加:如果我使用有效OpenExeConfiguration调用exePath,使用有效.config文件调用真实可执行文件(已测试),则会读取但是不解析文件。我必须为appSettings部分请求xml并自行解析,使用此答案{@ 3}}的解决方法。这增加了我的怀疑,这个代码在这种模式下并不常用,已被接受为工作而未经审查,因此可能是错误的。

我确信使用新的.NET Core配置API替换旧的XML只能得到很少的关注。

2 个答案:

答案 0 :(得分:0)

不确定是否可以将其称为错误

根据this参考

  

根据   http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/3943ec30-8be5-4f12-9667-3b812f711fc9   参数是exe的位置,然后该方法查找   对应于该exe的配置(我猜参数名称为   exePath现在有意义!)。

它还提供了一种解决方法 -

ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = "EXECONFIG_PATH" };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);

答案 1 :(得分:0)

所以你理解我有两个问题:

  1. 对于扩展名不是“exe”的文件,OpenExeConfiguration不会失败。

  2. 如果配置文件尚不存在,OpenExeConfiguration不会失败。

  3. 我理解这两点,但我会说这两点都是有争议的。

    1. 可执行文件不一定意味着扩展名为.exe的文件。是的,在Windows上通常是正确的,但让我们以Linux为例(我们可以这样做,因为.NET不仅限于Windows)。我可以使用任何扩展名的可执行.NET文件(甚至是notes.txt),或者根本没有扩展名,这没关系。我很乐意用“mono notes.txt”执行该文件,它将照常运行。

    2. 非现有配置文件不是Configuration对象的例外情况。它甚至具有名为HasFile的属性,用于指示该文件是否存在。我可以使用您的代码执行以下操作:

      var config = ConfigurationManager.OpenExeConfiguration("c:\\notes.txt"); 
      // config.HasFile == false here
      config.AppSettings.Settings.Add("test", "test");
      config.Save(ConfigurationSaveMode.Full, true);
      // config.HasFile == true here, and file is written to disk