如何阻止exe.config随程序部署且保证程序正常运行
兄弟,我太懂你这种突然被配置文件绑定的烦躁了——明明给App.config设了“不复制”,结果VS2022还是硬把myProgram.exe.config塞到输出目录,而且没这文件程序直接罢工,之前明明不用的,突然就变了,这波操作确实闹心。下面给你捋几个靠谱的解决路径,亲测有用:
先搞清楚:程序到底离不开config里的啥?
之前不用现在突然要,肯定是你最近加了什么功能(比如数据库连接串、第三方库的配置、应用级别的设置项),这些内容被写进App.config里了,程序启动时会自动去读。你先打开生成的myProgram.exe.config看看里面的节点,比如<connectionStrings>、<appSettings>、或者某个第三方库专属的配置段,这些就是程序的“刚需”内容,得先把它们安置好,才能丢外部config文件。把App.config彻底改成内嵌资源,不让VS输出到目录
光设“复制到输出目录”为“不复制”还不够,得改生成操作:- 右键项目里的
App.config→ 「属性」 - 把「生成操作」改成「嵌入的资源」,「复制到输出目录」保持「不复制」
- 之后得在代码里手动加载这个内嵌的配置,在程序启动的入口(比如
Program.cs的Main方法开头)加一段代码:using System.Configuration; using System.Reflection; // 替换成你的项目根命名空间,比如项目叫MyDemo,就写MyDemo.App.config var resourceName = "你的项目命名空间.App.config"; var configStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName); if (configStream != null) { var configMap = new ExeConfigurationFileMap { Stream = configStream }; // 加载内嵌的配置,后续程序里读配置就用这个config对象 var config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); // 举个例子:读AppSettings里的键值对 var mySetting = config.AppSettings.Settings["MyKey"]?.Value; }
这样程序启动时就会从自身内嵌的资源里读配置,不用再找外部的exe.config了。
- 右键项目里的
排查自动生成config的“隐形触发点”
如果你用了项目Properties里的Settings.settings文件,VS会自动把这些设置同步到App.config,而且默认会强制生成exe.config。这种情况的解决办法:- 如果你不需要动态修改这些设置,直接把Settings里的内容改成代码里的常量,然后删除
Settings.settings文件,断了VS自动生成配置的源头。 - 要是还想用Settings,就把Settings的“访问修饰符”改成内部,同时把
Settings.settings的生成操作也改成“嵌入的资源”,然后在代码里从内嵌资源加载配置后同步给Settings。
- 如果你不需要动态修改这些设置,直接把Settings里的内容改成代码里的常量,然后删除
最后验证:删了config文件再跑程序
改完所有设置后,重新编译项目,去输出目录(比如bin\Release)把myProgram.exe.config删掉,然后启动程序试试。如果还有报错,看报错信息里提到的配置项,把漏处理的内容补上就行。
内容来源于stack exchange

