编译WindowsFormsApp后能否将依赖及配置文件存放至独立子文件夹
Windows Forms 应用分离主程序与依赖、配置文件的实现方法
完全可以实现,按以下步骤操作即可:
步骤1:配置程序集探测路径
在项目的App.config文件中添加运行时程序集探测规则,告诉CLR运行时从extra目录查找托管依赖dll:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <!-- 指定额外的程序集探测目录,多个目录用分号分隔 --> <probing privatePath="extra"/> </assemblyBinding> </runtime> </configuration>
步骤2:修改默认配置文件读取路径
默认程序会读取和主程序同目录的.config文件,我们需要在程序入口最开头修改配置文件的加载路径。打开项目的Program.cs,在Main方法的第一行添加以下代码:
// 重定向配置文件路径到extra目录 AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"extra\rainbow.exe.config");
注意:该行代码必须放在所有读取配置、加载依赖的逻辑之前,否则会不生效
步骤3:调整文件目录结构
编译完成后,按你的需求整理文件:
- 主目录(folder)下只保留
rainbow.exe - 剩余的
rainbow.exe.config、所有托管依赖dll、资源文件等全部移动到extra子目录中
可选:适配非托管dll依赖
如果你的项目引用了非托管C/C++ dll,上述探测规则不生效,可额外添加以下逻辑:
- 在Program类中导入Win32 API:
[System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)] private static extern bool SetDllDirectory(string lpPathName);
- 在Main方法开头、加载非托管dll之前调用:
SetDllDirectory(@"extra");
调整后非托管dll也可以放在extra目录下正常加载。
内容的提问来源于stack exchange,提问作者779804
相关产品推荐
相关产品推荐

