试图在.net应用程序中读写受保护的内存

本文关键字:读写 受保护 内存 应用程序 net | 更新日期: 2023-09-27 18:13:59

我在IIS 6服务器上实现asp.net应用程序时遇到了麻烦。

当用户试图打开访问数据库的网页时,iis服务器抛出" attempt to read or write protected memory",这是StackTrace:

系统。AccessViolationException:试图读取或写入保护内存。这通常表明其他内存已损坏。在Oracle.DataAccess.Client.OpsPrm。ResetValCtx(OpoPrmValCtx* pOpoPrmValCtx, Int32 ctxSize)在Oracle.DataAccess.Client.OracleParameter。ResetCtx (Int32 arraySize)Oracle.DataAccess.Client.OracleParameter.PreBind (OracleConnectionconn, IntPtr errCtx, Int32 arraySize在Oracle.DataAccess.Client.OracleCommand。ExecuteReader(布尔请求,布尔填充请求,CommandBehavior行为)在Oracle.DataAccess.Client.OracleCommand.ExecuteReader ()在Oracle.DataAccess.Client.OracleCommand.ExecuteScalar ()在Tenaris.FSA.OracleProvider.OracleProvider。ExecuteScalar(String commandToExecute, CommandType, CommandType, DbParameter[] parameters)in C:' conelados FSA'FSA 1er Entregable05052013 ' Tenaris.FSA.OracleProvider ' OracleProvider.cs: 223行在Tenaris.FSA.DAC.Providers.DataAccessManager.ExecuteScalar(字符串commandToExecute, CommandType, CommandType, DbParameter[] parametersin C:' conelados FSA'FSA 1er Entregable05052013 ' ' Tenaris.FSA.DataAccessComponent '提供者DataAccessManager.cs:行59Tenaris.FSA.DAC.Repository.AppointmentWayClientDAL.GetCountRegisters(布尔C:' conelados FSA'FSA 1er Entregable05052013 ' Tenaris.FSA.DataAccessComponent ' Repository ' AppointmentWayClientDAL.cs:行39Tenaris.FSA.BusinessComponents.BusinessProcess.AppointmentWayClientManager.GetCountRegisters(布尔C:' conelados FSA'FSA 1er Entregable05052013 ' Tenaris.FSA.BusinessComponents ' BusinessProcess ' AppointmentWayClientManager.cs:行28日

很罕见,因为这个错误不应该出现在托管代码中,而且网站的前一个版本工作得很好。我做了几次测试,比如在x86平台的pc上编译应用程序,复制网页。从功能版本的配置,复制Oracle。

从功能版本的DataAccess dll中删除,但仍然显示错误。

你应该知道的另一件事是,有一个页面,实际上成功地填写了一个下拉列表,但随后页面必须填写一个gridview,出现了上述异常

试图在.net应用程序中读写受保护的内存

我终于可以解决这个问题了,另一个开发人员在创建OracleParameters时使用了"using"子句,就像:

using(OracleParameter prm = SomeMethodThatCreatesIt(value,paramName))
{
 //extracode
 myCommand.Parameters.Add(prm);
}

所以代码必须改成:

OracleParameter prm = SomeMethodThatCreatesIt(value,paramName);
//extracode
myCommand.Parameters.Add(prm);

正如您在堆栈跟踪中看到的那样,问题出在参数的某个进程上。

所以,代码在使用对象之前处理它。我不明白的是为什么它甚至在控制台应用程序中工作,这是我的一个测试,但它现在正在工作,谢谢大家

系统已经没有足够的内存来加载它,所以当它试图从其他受保护的应用程序中获取更多内存时,请获取更多内存