如何阻止AppDomain.CurrentDomain.BaseDirectory在执行过程中变更?
问题分析与解决方案
核心问题定位
你的问题本质是程序执行中当前工作目录(Environment.CurrentDirectory)被意外修改,而非AppDomain.CurrentDomain.BaseDirectory本身变更——你用MsgBox看到的BaseDirectory是正确的,但后续文件操作可能误依赖了随时会被第三方组件修改的工作目录,最终指向打印池路径(C:\Windows\System32\spool\Drivers\x64\3\)。这个现象和Crystal Reports打印子系统、log4net的行为高度相关。
具体解决步骤
1. 强制使用绝对路径,彻底脱离工作目录依赖
所有文件操作必须用AppDomain.CurrentDomain.BaseDirectory拼接绝对路径,禁止使用相对路径:
' 正确写法:拼接绝对路径 Dim configPath As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Connection.Json") ' 错误写法:依赖当前工作目录 ' Dim configPath As String = "Connection.Json"
2. 修复Crystal Reports导致的工作目录切换
Crystal Reports在渲染、打印报表时,会调用系统打印子系统,大概率会临时切换到打印池目录。你需要在关键操作前后保存并恢复工作目录:
' 执行Crystal Reports操作前保存原目录 Dim originalDir As String = Environment.CurrentDirectory Try ' 此处执行报表渲染、打印逻辑 ' ... Finally ' 强制恢复原工作目录 Environment.CurrentDirectory = originalDir End Try
针对BonnyMdi_FormClosing事件的偶发异常,直接在事件开头强制切回程序目录:
Private Sub BonnyMdi_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing ' 先把工作目录切回程序根目录 Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory Try ' 你的文件导出、清理逻辑 ' ... Catch ex As Exception ' 补充日志,记录当前目录信息方便排查 Dim logMsg As String = $"异常信息:{ex.Message}{vbCrLf}" & $"当前BaseDirectory:{AppDomain.CurrentDomain.BaseDirectory}{vbCrLf}" & $"当前CurrentDirectory:{Environment.CurrentDirectory}" ' 写入日志或弹窗提示 MsgBox(logMsg) End Try End Sub
3. 阻止log4net修改工作目录
如果确实是log4net导致的目录变更,按以下方式处理:
- 初始化时指定绝对路径的配置文件:
Dim logConfigPath As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config") log4net.Config.XmlConfigurator.Configure(New FileInfo(logConfigPath)) - 配置文件中所有输出路径用绝对路径:
<appender name="FileAppender" type="log4net.Appender.FileAppender"> <!-- 用绝对路径,不要写相对路径 --> <file value="D:\NB\Logs\app.log" /> <!-- 其他配置项 --> </appender> - 程序启动时固定工作目录:
在Module.vb的Main方法开头添加:Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory
4. 排查偶发异常的额外手段
因为异常不是每次触发,大概率是异步操作未完成导致的:
- 在
FormClosing事件中,检查是否有未完成的Crystal Reports异步任务,等待完成后再执行文件操作; - 给异常处理添加更详细的上下文日志,包括当前线程ID、操作触发时机,方便定位偶发场景。
内容的提问来源于stack exchange,提问作者bonny
相关产品推荐
相关产品推荐

