C# .NET Framework项目独立exe生成或子文件夹部署咨询
解决方案:单文件输出或子文件夹整理
一、先明确两个文件的作用
- Ookii.Dialogs.Wpf.xml:这是类库的XML注释文件,仅在Visual Studio开发时提供智能提示,程序运行完全不需要,可以直接删除,没必要整合。
- Myapp.exe.config:这是应用程序配置文件,程序启动时默认读取同目录下的该文件,用来配置AppSettings、连接字符串等,运行时大概率需要保留。
二、单文件输出(把.config整合进.exe)
你已经用Costura搞定了DLL整合,现在只需要处理.config:
方法1:用Fody插件一键整合
- 右键项目→管理NuGet程序包,搜索安装
Fody和EmbedConfig.Fody - 安装完成后,项目会自动生成
FodyWeavers.xml,确保里面包含以下内容:<Weavers> <Costura /> <EmbedConfig /> </Weavers> - 重新编译项目,EmbedConfig会自动把
Myapp.exe.config嵌入到.exe里,程序启动时会自动读取嵌入的配置,直接删掉原.config文件就行。
方法2:手动嵌入并加载配置
不想用插件的话可以自己写代码实现:
- 选中
Myapp.exe.config,右键→属性,把“生成操作”改成“嵌入的资源” - 在程序入口(比如
Program.cs的Main方法)加这段代码,加载嵌入的配置:using System; using System.Configuration; using System.IO; using System.Reflection; namespace Myapp { class Program { static void Main(string[] args) { // 加载嵌入的配置文件,注意资源名是"命名空间+文件名",根据自己项目调整 var assembly = Assembly.GetExecutingAssembly(); var resourceName = "Myapp.Myapp.exe.config"; using (Stream stream = assembly.GetManifestResourceStream(resourceName)) { if (stream != null) { // 临时复制到本地文件供ConfigurationManager读取 var tempConfigPath = Path.GetTempFileName(); using (var fileStream = File.Create(tempConfigPath)) { stream.CopyTo(fileStream); } var configMap = new ExeConfigurationFileMap { ExeConfigFilename = tempConfigPath }; ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); } } // 后续程序逻辑 } } } - 编译后删掉原
Myapp.exe.config,程序就能正常读取嵌入的配置了。
三、子文件夹整理方案(把非.exe文件放进/Config)
如果不想搞单文件,只想把多余文件塞进Config子文件夹:
步骤1:自动移动文件到Config文件夹
- 右键项目→属性→生成事件→后期生成事件命令行,加下面的命令,编译后自动把文件移过去:
要是没创建move "$(TargetDir)Myapp.exe.config" "$(TargetDir)Config\" move "$(TargetDir)Ookii.Dialogs.Wpf.xml" "$(TargetDir)Config\"Config文件夹,先手动在输出目录建一个,或者在项目里加个Config文件夹,设置“复制到输出目录”为“始终复制”。
步骤2:让程序读取Config里的.config
默认程序只会读同目录的.config,所以要改启动逻辑加载子文件夹里的配置:
static void Main(string[] args) { string configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config", "Myapp.exe.config"); if (File.Exists(configPath)) { var configMap = new ExeConfigurationFileMap { ExeConfigFilename = configPath }; ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); } // 后续程序逻辑 }
步骤3:处理Ookii的XML文件(可选)
因为这个文件运行时没用,只要移去Config文件夹就行,不用加额外代码;要是开发时需要智能提示,在Visual Studio里手动指定注释文件路径就行,不影响程序运行。
内容的提问来源于stack exchange,提问作者NIxz
相关产品推荐
相关产品推荐

