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

Is this really a bug with ConfigurationManager.OpenExeConfiguration?

ConfigurationManager.OpenExeConfiguration(string exePath)documentation 状态:

Opens the specified client configuration file as a Configuration object.

它还指出 exePath 是 "The path of the executable (exe) file"

该方法应该在 exePath 指定的路径中打开可执行文件的 *.exe.config 文件,如果 "A configuration file could not be loaded." 将抛出 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 个意见。连接目前已关闭。

已添加: 如果我使用有效的 exePath 调用 OpenExeConfiguration 到真正的可执行文件(已测试),使用有效的 .config文件,然后它读取但不解析文件。我必须为 appSettings 部分请求 xml 并自己解析它,使用这个对 AppSettings from custom files 的回答中的变通方法。这增加了我的怀疑,即这段代码在这种模式下并不常用,已被接受为有效但未经过审查,因此可能存在错误。

我敢肯定,新的 .NET Core 配置 API 只替换了旧的 XML,它不会受到太多关注。

不确定它是否可以称为错误但是

根据this参考文献

According to http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/3943ec30-8be5-4f12-9667-3b812f711fc9 the parameter is the location of an exe, and the method then looks for the config corresponding to that exe (I guess the parameter name of exePath makes sense now!).

它也给出了一个解决方法--

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

据我了解,您有两个顾虑:

  1. 对于扩展名为 "exe".

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

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

  1. 可执行文件不一定是扩展名为.exe的文件。是的,在 Windows 上通常是正确的,但让我们以 Linux 为例(我们可以这样做,因为 .NET 不仅限于 Windows)。我可以拥有任何扩展名(甚至 notes.txt)或根本没有扩展名的可执行 .NET 文件,这都没有关系。我可以愉快地使用 "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