天天看点

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

     经过一段时间的摸索,终于发现是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了:

                member.IsVip= (bool)row["IsVip"];

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

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