【Emit基础】System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

     当我将基于DataRabbit的应用程序放到windows server 2008 SP1上运行时,抛出了System.AccessViolationException,提示信息为:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”。而这个应用程序在windows server 2003上一直是非常正常的。根据异常的堆栈信息,可以知道是IORMapping<TEntity>.GetEntityFrom()方法抛出的,而IORMapping<TEntity>接口的实现是由Emit生成的动态类来完成的,而这个Emit工作了1年多一直没有出现过问题。

     (关于为什么使用Emit请参见这篇文章:DataRabbit 轻量的数据访问框架(13)--DataRabbit 3.0 ORM性能大幅度提升!

 

     经过一段时间的摸索,终于发现是Emit将DataRow之中的bool字段赋值给对应的Entity字段时出现的,例如,Emit生成的代码类似这样:

            if (row["IsVip"] != DBNull.Value)
            {
                member.IsVip= bool.Parse(row["IsVip"].ToString());
            }

     就是这段代码导致了在windows server 2008 SP1上的System.AccessViolationException ,于是我修改Emit,使其生成类似下面的代码就OK了:

            if (row["IsVip"] != DBNull.Value)
            {
                member.IsVip= (bool)row["IsVip"];
            }

     

     如此问题解决了。更进一步,我想将所有的值类型都Emit出Cast代码直接进行转换,而不是通过Parse方法,很奇怪,当遇到Decimal类型时,就不行了,它抛出System.InvalidProgramException异常:“JIT编译器遇到内部限制”。看来并不是所有的值类型都能Emit 直接的Cast转换。不知“JIT编译器遇到内部限制”指的是JIT究竟遇到了什么限制?

     更正后的DataRabbit的最新版本,我放到了DataRabbit 轻量的ORM框架(00) -- 序 的文末提供下载。

 

2008-09-21 正解:row["IsVip"]返回的是object,转换为值类型应该用unbox,而不是cast。

 

时间: 2024-09-14 21:36:22

【Emit基础】System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。的相关文章

c#调c++dll,尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

问题描述 调用时尝试读取或写入受保护的内存.这通常指示其他内存已损坏.不知道是什么情况,网上好多都是c++Long对应c#int,但是我已经转了还是没用,这代码一开始时可以用的,我重装了win7系统后就运行不了了....求大神帮忙c++:extern"C"__declspec(dllexport)BOOL__stdcallTCR_OpenReader(longnPort){if(1==g_iProtocol){g_CardReader.CreateInterface("1.d

未处理AccessViolationException(尝试读取或写入受保护的内存。这通常指示其他内存已损坏)

问题描述 未处理AccessViolationException(尝试读取或写入受保护的内存.这通常指示其他内存已损坏)我在一个窗体里设置了他的主窗体Me.MdiParent=MDIPmain就会弹出上面这样的错误提示,我去掉的话就没错,这是什么问题?哪位大哥知道呀,该怎么改? 解决方案 解决方案二:用了ShowDialog?改成frm.show试试解决方案三:我用的就是show没用showDialog解决方案四:这个主窗体名称是否有误这个主窗体是否是同一程序里的解决方案五:引用3楼dylike

C#调用Haskell时的“尝试读取或写入受保护的内存”问题

最近一直被C#调用Haskell时的"尝试读取或写入受保护的内存"问题所困扰(详见C#调用haskell遭遇Attempted to read or write protected memory,C#调用haskell时的"尝试读取或写入受保护的内存"问题),而且困在其中,越陷超深,无法自拔,差点弃用C#解决我们面临的问题. 问题是这样的,只要在Haskell代码中对字符串进行操作,在C#调用时就会引发异常: An unhandled exception of ty

dll c#-c#调用c++的dll出现尝试读取或写入受保护的内存问题

问题描述 c#调用c++的dll出现尝试读取或写入受保护的内存问题 使用c#调用c++的一个dll.c++的接口函数为: extern "C" __declspec(dllexport)bool __stdcall CreateDetmObject(IDetManager **ppDetManager); 参数IDetManager为一个结构体: struct IDetManager { virtual void __stdcall SetListener(HWND hWnd) = 0

c#调用dll 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

问题描述 调用一个自己写的c++的dll,结果出现问题提示如下:"System.AccessViolationException"类型的未经处理的异常出现在BidingSystem_Client.exe中.其他信息:尝试读取或写入受保护的内存.这通常指示其他内存已损坏.--------------------------------------------c#[DllImport("PEKS.dll",CharSet=CharSet.Ansi,CallingConv

求助,C#调用C++dll时提示:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

问题描述 C++dll的头文件接口描述如下:#pragmapack(push,1)typedefstructXCtrlStatus{XCtrlStatus(unsignedlongV=0){*reinterpret_cast<unsignedlong*>(this)=V;}unsignedcharERR:1;unsignedcharAUTO:1;unsignedcharRUN:2;unsignedcharDIR:2;unsignedchar:1;unsignedchar:1;unsignedc

SDK3000设置视频帧率出现《尝试读取或写入受保护的内存》

问题描述 本人是一位新人,最近用C#在开发一个汽车管理系统,用SDK3000进行2次开发下面是我出问题的代码privatevoidConnect_Click(objectsender,EventArgse){intNumCard=0;SDK3000ApiClass.VCAInitSdk();SDK3000ApiClass.VCAGetDevNum(refNumCard);SDK3000ApiClass.SizeStreamSize;StreamSize.x=480;StreamSize.y=32

C++的结构体转换为C#的,尝试读取或写入受保护的内存。这通常指示其他内存已损坏

问题描述 各位大神们,我在C#中调用c++的dll提供的接口函数,函数中需要传递一个结构体dll中的函数接口是:ReadTag(HANDLEhHandle,REC_INFO&data);其中REC_INFO是一个结构体structREC_INFO{BYTEInfoType;union{//收集标签返回struct{BYTETagID[8];//BYTETagState;struct{BYTETagPower:2;BYTETagSensor:1;BYTETagInitialization:1;BY

C#调用其他语言DLL库,提示尝试读取或写入受保护的内存。这通常指示其他内存已损坏

问题描述 C#调用其他语言DLL库,提示尝试读取或写入受保护的内存.这通常指示其他内存已损坏代码如下==========================================DLL函数int__stdcallActionReceived(constchar*devId,constint*windowId,constchar*cmd,char*data)==========================================C#调用[DllImport(@"Caller.dl