You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:12:45