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