天天看點

【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。