經過一段時間的摸索,終于發現是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。