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

简介: 当我将基于DataRabbit的应用程序放到windows server 2008 SP1上运行时,抛出了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。

 

目录
相关文章
|
数据库连接 数据库 C++
|
安全 前端开发 rax
Windows Server中的 WINS 服务器远程内存损坏漏洞分析
本文讲的是Windows Server中的 WINS 服务器远程内存损坏漏洞分析,在2016年12月,FortiGuard Labs发现并报告了Microsoft Windows Server中的WINS Server远程内存损坏漏洞。
1857 0
|
存储 安全 NoSQL
Linux环境中堆栈和堆相关内存损坏的基本原理和调试方法介绍
本文讲的是Linux环境中堆栈和堆相关内存损坏的基本原理和调试方法介绍,建议阅读本文之前,你对ARM组件的有个基本了解,本文会先为你介绍32位Linux环境中进程的内存布局,然后再介绍堆栈和堆相关内存损坏的基本原理以及调试方法。
2268 0
|
C# 数据库 C++
C#尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
原文: C#尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 今天打开一个之前写的程序,查询数据库资料,结果单击查询时出错,提示显示和ntdl.dll有关。
4580 0
|
NoSQL 存储 iOS开发
内存损坏问题的示例及分析
原文以示例代码系统的讲述了三种内存损坏的情况: 全局内存、栈损坏及堆损坏, 以及它们产生的原因。粗略整理如下。 Global Memory Corruption 即全局变量的内存使用出了问题,主要还是越界。
912 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
321 0
|
9天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
18 1
|
13天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
17天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
22天前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
35 4