1

状态的文档ConfigurationManager.OpenExeConfiguration(string exePath)

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

它还指出这exePath是“可执行(exe)文件的路径”

该方法应该*.exe.config在 指定的路径打开可执行文件的文件,exePath如果ConfigurationErrorsException“无法加载配置文件。”将抛出 a。

以下代码使用非可执行文件的路径,并且该路径的目录不包含 *.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则它会读取但不解析文件。我必须请求该部分的 xml并自己解析它,使用来自自定义文件的 AppSettingsappSettings这个答案的解决方法。这增加了我的怀疑,即此代码在此模式下不常用,已被接受为有效且未经过审查,因此可能存在错误。

我敢肯定,新的 .NET Core 配置 API 只会取代旧的 XML,它不会受到关注。

4

2 回答 2

2

因此,据我了解,您有两个担忧:

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

  2. 如果配置文件不存在,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
    
于 2016-10-08T17:10:23.313 回答
0

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

根据这个参考

根据 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);
于 2016-10-08T12:26:44.093 回答