C#怎么动态加载外部配置文件_C#如何实现热更新机制【解析】
应使用AppContext.BaseDirectory作为基准路径加载外部JSON配置文件配合AddJsonFile(..., optional: true, reloadOnChange: true)并注入IOptionsMonitorT实现热更新避免使用IOptionsT或手动缓存。用 ConfigurationBuilder 加载外部 JSON 文件时路径容易错动态加载配置文件的核心是绕过默认的 appsettings.json让程序在运行时读取指定路径的文件。但多数人卡在路径解析上——directory.getcurrentdirectory() 返回的是启动目录比如 bin/debug不是项目根目录如果硬写相对路径发布后很可能找不到文件。推荐用 AppContext.BaseDirectory 作为基准路径它始终指向当前程序集所在目录发布前后行为一致配置文件建议放在与 .dll 同级的 config/ 子目录下避免污染主目录加载时必须调用 .AddJsonFile(path, optional: true, reloadOnChange: true)其中 reloadOnChange: true 是热更新的前提但仅对文件系统变化有效不适用于网络或数据库配置示例var config new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory) .AddJsonFile(config/appsettings.custom.json, optional: true, reloadOnChange: true) .Build();IOptionsMonitorT 才能真正响应配置变更很多人用了 reloadOnChange: true 却发现类里注入的 IOptionsT 值没变——因为 IOptionsT 只在服务注册时快照一次而 IOptionsMonitorT 才会监听底层 IConfiguration 的变更事件并触发重绑定。注册时无需额外操作.NET 默认已注册 IOptionsMonitorT构造函数中直接注入 IOptionsMonitorMyConfig它的 CurrentValue 会自动更新如果需要在值变化时执行逻辑可订阅 OnChanged 回调optionsMonitor.OnChanged(config { /* 处理更新 */ });热更新不是实时的有 1 秒左右延迟且依赖文件系统通知.NET 的 reloadOnChange 底层靠 FileSystemWatcher它不是轮询而是监听操作系统文件事件。这意味着修改保存后Linux/macOS 下可能因 inotify 限制或编辑器“原子写入”先写临时文件再替换导致丢失事件建议用 vim 或 echo 测试避开 VS Code 的保存策略Windows 下一般无问题但若配置文件被其他进程独占如记事本未关闭更新会静默失败延迟通常在 500ms–2s无法做到毫秒级响应高频修改如每秒多次可能合并为一次通知错误现象log.LogInformation(Config updated) 没输出或 CurrentValue 仍为旧值——先检查文件是否真被写入再确认没被锁住。 Zeemo AI 一款专业的视频字幕制作和视频处理工具