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
相关产品推荐
相关产品推荐

