背景:
不久前,我发布了一个调试工具:发布:.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。 2:as 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)
这个异常是什么等会再说,先补充知识点先:
1:as 类型转换:只检测上下文中类型是否一致(或存在隐式转换),若失败返回null,不抛异常。 2:强制类型转换:尝试进行类型转换,转换失败时,抛出异常。
好吧,第一个坑,相同的类型,没有异常,埋的够深!!!
AS叫了:这坑不能怪我,要怪就怪Assembly.LoadFrom,谁让你们把我们分隔在不同的上下文中。<