为C# as 类型转换及Assembly.LoadFrom埋坑!

背景:

不久前,我发布了一个调试工具:发布:.NET开发人员必备的可视化调试工具(你值的拥有)

效果是这样的:

之后,有小部分用户反映,工具用不了(没反应或有异常)~~~

然后,建议小部分用户换个电脑环境试试,有些就好了~~~

于是,我假定是VS环境下的 Microsoft.VisualStudio.DebuggerVisualizers.dll 的版本不一致引发的。

因此,一般我都建议用户自己下载源码,重新引用去编绎一下!!!

由于该工具一直在CSDN论坛的VB.NET版块置顶着。

考虑到受众多,中间还偷偷升级过几回,解决了抛异常的问题,不过仍没有从根本性解决~~~~

这两天,有个叫子寒的同学,找上了我,希望我帮他解决这个问题。

我试着重新编绎了编绎发给他,都反馈木有效果。

只好让他下载源码,并在他电脑上进行远程调试。

昨晚处理到深夜1点半,终于:把发现的两个坑给埋了!!!

下面介绍下这两个坑:

1:as 转换的坑:

先看一段源码,这是拿到反序列化的结果,转Table,再绑定:

 protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
            MDataTable dt = objectProvider.GetObject() as MDataTable;
            FormCreate.BindTable(windowService, dt, null);
        }

在这段代码中,调试的结果:

1:objectProvider.GetObject() 拿到的对象是MDataTable,GetType也返回的CYQ.Data.Table.MDataTable。

2as MDataTable 却返回了null ?

咦?一个大大的问号在我面前,同样的类型,怎么as不过去?

于是我把代码改了一下:

MDataTable dt=(MDataTable)objectProvider.GetObject()

抛异常了:

************** 异常文本 **************
System.InvalidCastException: [A]CYQ.Data.Table.MDataTable 无法强制转换为 [B]CYQ.Data.Table.MDataTable。
类型 A 源自“CYQ.Data, Version=5.7.5.5, Culture=neutral, PublicKeyToken=null”(在字节数组的上下文“LoadNeither”中)。
类型 B 源自“CYQ.Data, Version=5.7.5.5, Culture=neutral, PublicKeyToken=null”(在上下文“LoadFrom”中的“C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\Visualizers\CYQ.Data.dll”位置处)。
   在 CYQ.Visualizer.MDataTableVisualizer.Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
   在 Microsoft.VisualStudio.DebuggerVisualizers.DebugViewerShim.ManagedShim.DelegatedHost.CreateViewer(IntPtr hwnd, HostServicesHelper hsh, SafeProxyWrapper proxy)

这个异常是什么等会再说,先补充知识点先:

1as 类型转换:只检测上下文中类型是否一致(或存在隐式转换),若失败返回null,不抛异常。

2:强制类型转换:尝试进行类型转换,转换失败时,抛出异常。

好吧,第一个坑,相同的类型,没有异常,埋的够深!!!

AS叫了:这坑不能怪我,要怪就怪Assembly.LoadFrom,谁让你们把我们分隔在不同的上下文中。<

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值