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

C#写入文件流时报错,DLL运行错误路径指向原开发项目

问题原因分析

1. 运行时抛出错误的原因

报错堆栈指向WriteFile方法第71行的fs.Flush()调用,你的代码中资源释放顺序存在错误:

  • 先执行了fs.Close()、fs.Dispose(),已经将文件流对象销毁、释放了所有关联的非托管资源
  • 后续再调用fs.Flush()时,流对象已经处于销毁状态,自然会抛出ObjectDisposedException
    文件可以成功写入是因为序列化、writer.Flush()、writer.Close()这些写操作都在流销毁之前执行完成,错误是后续多余的Flush调用导致的。

2. 报错路径为原开发项目路径的原因

该现象由PDB(程序数据库)文件导致:
你编译DLL时生成了PDB文件,该文件内存储了编译时对应源代码的本地绝对路径,运行时抛出异常时,调试信息会读取PDB中的路径信息,所以显示的是开发机上的原始项目路径,和DLL实际运行路径无关。

解决方案

1. 修复写入方法报错

推荐直接用using语句自动管理资源释放,不需要手动调用Close/Dispose,避免出现顺序错误,修复后的代码如下:

public static bool WriteFile(string path, Prediction prediction)
{
    if (File.Exists(path))
        return false;

    if (prediction == null)
        throw new Exception("No prediction was returned");

    XmlSerializer serializer = new XmlSerializer(typeof(Prediction));
    // using语句会在代码块结束后自动释放资源,无需手动关闭
    using Stream fs = new FileStream(path, FileMode.Create);
    using XmlWriter writer = XmlWriter.Create(fs, new XmlWriterSettings { Indent = true, Encoding = Encoding.Unicode });
    serializer.Serialize(writer, prediction);
    // 不需要手动Flush、Close,using会自动处理所有释放逻辑
    return true;
}

如果要保留原来的手动释放写法,直接删除fs.Dispose()之后的那行fs.Flush()即可解决报错。

2. 移除报错信息中的开发路径

  • 发布生产环境时,不要将对应DLL的PDB文件一同上传部署
  • 也可以在Release编译配置中修改调试信息生成规则:打开项目属性→生成→高级→调试信息,选择「无」或者「便携式」,重新编译的DLL就不会携带开发机的源文件路径信息。

内容的提问来源于stack exchange,提问作者davidvera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:30:01