不同dll相同Type.FullName引发的问题
客戶反應一個應用沒有規律性的錯誤,一旦異常發生后大部分功能無法再使用,除非重新啟動應用程序池。異常內容大致如下:
2282 Error 無法將[141]綁定到字段 ID(不能從System.Int32轉換為System.Int32) |--對象與目標類型不匹配。查看callstack了解到該異常由OR mapping的組件引起,調用System.Reflection.PropertyInfo的SetValue拋出異常。MSDN描述導致TargetException的情況如下:
The object does not match the target type, or a property is an instance property but obj is null.看到這個描述有些無奈,OR mapping組件內部調用沒有問題,而現有條件只允許分析crash dump,無法得知SetValue時obj的值,逐步分析產生調用的源代碼毫無進展。懷疑緩存實體類型內部的Property映射錯了,用!da -details查看Hashtable的buckets鍵值沒有問題(使用類型的FullName)。決定先用!dumpheap查看一下實體類型的使用情況,突然有了進展:
0:039> !dumpheap -type xxx.DeptInfo ------------------------------ Heap 0Address MT Size 00000001002dbf70 000007ff0084dce0 88 0000000101cbbb80 000007ff008a7a80 40 0000000101cc32f8 000007ff0084dce0 88 0000000101d094f8 000007ff008a7a80 40 0000000101d10b70 000007ff0084dce0 88 0000000101d77f10 000007ff0080fc18 40 0000000101d7f548 000007ff00774090 88 0000000101d7fca8 000007ff00774090 88 0000000102bb7028 000007ff008a7a80 40 0000000102bbe6a0 000007ff0084dce0 88 0000000102c32328 000007ff008a7a80 40 0000000102c399a0 000007ff0084dce0 88 0000000104662f40 000007ff0080fc18 40 000000010466a5b0 000007ff00774090 88 000000010466acf8 000007ff00774090 88 total 15 objects ------------------------------ Heap 1Address MT Size 0000000140ac8570 000007ff0084dce0 88 00000001428a1798 000007ff008a7a80 40 00000001428a8e10 000007ff0084dce0 88 00000001450898a8 000007ff008a7a80 40 0000000145090f20 000007ff0084dce0 88 00000001450e28b0 000007ff008a7a80 40 00000001450e9f28 000007ff0084dce0 88 0000000145135840 000007ff008a7a80 40 000000014513ceb8 000007ff0084dce0 88 000000014519d7b0 000007ff008a7a80 40 00000001451a4e28 000007ff0084dce0 88 00000001451f0718 000007ff008a7a80 40 00000001451f7d90 000007ff0084dce0 88 0000000145292618 000007ff008a7a80 40 0000000145299c90 000007ff0084dce0 88 00000001452fd2f0 000007ff008a7a80 40 0000000145304968 000007ff0084dce0 88 0000000147c663e8 000007ff0084dce0 88 0000000147c67ed0 000007ff008a7a80 40 0000000147c6dfe0 000007ff0084dce0 88 0000000147c90a58 000007ff0084dce0 88 0000000147c9b8e8 000007ff008a7a80 40 0000000147ca19f8 000007ff0084dce0 88 total 23 objects ------------------------------ total 38 objects Statistics:MT Count TotalSize Class Name 000007ff0080fc18 2 80 System.Collections.Generic.List`1[[xxx.Entity.DeptInfo, xxx.Published]] 000007ff00774090 4 352 xxx.DeptInfo 000007ff008a7a80 14 560 System.Collections.Generic.List`1[[xxx.Entity.DeptInfo, xxx.Entity]] 000007ff0084dce0 18 1584 xxx.DeptInfo Total 38 objects相同FullName的類型出現了兩個:xxx.DeptInfo,只是來源于不同的dll。至此基本可以判斷由于OR mapping框架使用Type的FullName作為緩存鍵值,在w3p.exe重新創建后,任意來源的一次調用定義了xxx.DeptInfo的緩存,導致另一個dll內相同FullName的實體綁定時出現類型實例和PropertyInfo不匹配的情況。通過走查對方代碼發現確實存在該問題。
轉載于:https://www.cnblogs.com/junchu25/archive/2013/03/08/2950654.html
總結
以上是生活随笔為你收集整理的不同dll相同Type.FullName引发的问题的全部內容,希望文章能夠幫你解決所遇到的問題。