在写C#的时候,有时候需要应用程序配置文件,即 "应用程序名.config",也可为“应用程序名.exe.config”,对于这两种名称,程序在运行时都能够正确读取,假如两者都存在,则优先读取“应用程序名.exe.config”。可以说,对于应用程序的运行,这两个命名没有区别,但是,在其他一些方面,这两个就有一些区别了。
情景一:
调试时
进行debug调试的时候,程序只读取“应用程序名.exe.config”这种配置文件,当你的调试目录下有"应用程序名.config"而没有“应用程序名.exe.config”的时候,你读取到的结果将是null,即使你的"应用程序名.config"文件中确实有你读取的那个段的名称。这种结果对于<appSettings>段或者你的自定义段(customSections)都是一样的,所以要注意。
如下图:
可以看到,appsettingsTest.config里面是有Chinese这个段的,但是section0仍为null。此时只要重命名appsettingsTest.config为appsettingsTest.exe.config即可正常调试。
情景二:
*.config配置文件的生成
这种配置文件的生成有两种方法,
一是手动添加
这样就会自动生成一个名为 App.config的文件在解决方案里面,不要重命名这个文件,然后在生成解决方案的时候,vs会自动复制一个内容一致,名字为“应用程序名.exe.config”的配置文件到程序目录。
另一种生成的方法是用代码生成:
// Get the application configuration file. System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration( ConfigurationUserLevel.None); config.AppSettings.Settings.Add(key, value); // Save the configuration file. config.Save(ConfigurationSaveMode.Modified); // Force a reload of the changed section. This // makes the new values available for reading. ConfigurationManager.RefreshSection(sectionName);
用这种方法,假如开始不存在“应用程序名.exe.config”或者“应用程序名.config”,程序将会自动生成“应用程序名.config”,注意,不是“应用程序名.exe.config”。假如此时再进行debug,调试读取config,将会返回null。
假如在调试的时候,程序目录下无“应用程序名.config”,也无“应用程序名.exe.config”,此时运行上面代码将出现什么名字的config呢,答案是“应用程序名.vshost.exe.config”,这个文件是临时的,一般会在调试结束之后被自动删除,而且这个名字也无法作为程序正常运行时的配置文件。
所以当你遇到调试读取配置文件时,明明那个段有内容,但仍读到null时,可检查一下config文件的命名。