Windows Server控制台应用偶现程序集加载失败(媒体受写保护)求助
我有一个运行在Windows Server上的控制台应用,多数情况下运行正常,但偶尔会在执行以下代码将数据库数据读取到DataSet时抛出异常:
adapter.Fill(dataset, "users")
异常提示无法加载文件或程序集(有时为System.Xml,有时为System.Web)或其依赖项,错误信息为**“媒体受写保护(Exception from HRESULT: 0x80070013)”**,且异常很快会自行恢复。相关堆栈跟踪信息如下:
第一种异常堆栈:
Exception : Could not load file or assembly 'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The media is write protected. (Exception from HRESULT: 0x80070013) at Oracle.DataAccess.Client.OracleParameter.IsProviderSpecificNullValue(Object value) at Oracle.DataAccess.Client.OracleParameter.SetStatus(Int32 arraySize) at Oracle.DataAccess.Client.OracleParameter.PreBind(OracleConnection conn, IntPtr errCtx, Int32 arraySize) at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior) at Oracle.DataAccess.Client.OracleDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable)
第二种异常信息:
Exception : Could not load file or assembly 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The media is write protected. (Exception from HRESULT: 0x80070013)
可能的原因
存储介质的临时访问锁定或写保护:
程序集文件(如System.Xml、System.Web通常位于GAC或系统目录)可能被系统工具临时锁定,比如杀毒软件的实时扫描、备份程序的文件快照、磁盘整理工具的操作,这些操作会临时给文件加上写保护属性或锁定,导致CLR加载程序集时无法读取/写入相关文件,触发异常。当这些工具操作完成后,锁定解除,异常自行恢复。程序集影子副本的创建失败:
.NET CLR加载程序集时会在临时目录(如C:\Windows\Temp或用户临时文件夹)生成影子副本,避免原文件被占用。如果临时目录所在磁盘被临时写保护、磁盘空间不足,或者应用程序对临时目录没有足够的读写权限,会导致影子副本创建失败,抛出“媒体受写保护”的错误。Oracle客户端与.NET的资源冲突:
从堆栈跟踪看,异常触发于OracleParameter的处理流程中。Oracle.DataAccess.Client组件在处理数据库参数时,可能需要动态加载相关.NET程序集,此时如果Oracle客户端组件与.NET运行时之间存在资源竞争(比如内存不足导致的文件缓存异常),或者Oracle客户端的某些依赖文件被临时锁定,会间接引发程序集加载的异常。系统级临时资源故障:
Windows Server的内存不足、磁盘缓存异常,或者系统的I/O子系统临时故障,都可能导致文件访问时出现临时的写保护错误。这类故障通常是瞬时的,系统自行恢复后异常就不再出现。
内容的提问来源于stack exchange,提问作者Robin Sun

