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只能得到很少的关注。
答案 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)
所以你理解我有两个问题:
对于扩展名不是“exe”的文件,OpenExeConfiguration不会失败。
如果配置文件尚不存在,OpenExeConfiguration不会失败。
我理解这两点,但我会说这两点都是有争议的。
可执行文件不一定意味着扩展名为.exe的文件。是的,在Windows上通常是正确的,但让我们以Linux为例(我们可以这样做,因为.NET不仅限于Windows)。我可以使用任何扩展名的可执行.NET文件(甚至是notes.txt),或者根本没有扩展名,这没关系。我很乐意用“mono notes.txt”执行该文件,它将照常运行。
非现有配置文件不是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