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

转载于:https://www.cnblogs.com/junchu25/archive/2013/03/08/2950654.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值