不同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 0
         Address               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 1
         Address               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不匹配的情况。通过走查对方代码发现确实存在该问题。

posted @ 2013-03-08 19:46  junchu25  阅读(707)  评论(0编辑  收藏  举报