当前位置: 首页 > news >正文

静态网站制作模板做视频在哪个网站收益高

静态网站制作模板,做视频在哪个网站收益高,网页制作入门基础教程,淮安网站建设推广已知,子类B继承自父类A,但是在代码运行时,B类强制转换为A类,却报代码转换异常。 很奇怪的问题吧,不过这个也是难得机会,去研究C#运行的底层原理。 下面是报错的代码片段。 string className _shapeRefle…

已知,子类B继承自父类A,但是在代码运行时,B类强制转换为A类,却报代码转换异常。
很奇怪的问题吧,不过这个也是难得机会,去研究C#运行的底层原理。

下面是报错的代码片段。

string className = _shapeReflectMap[typeName].ClassName;
Assembly assem = _shapeReflectMap[typeName].Assem;
Object obj = assem.CreateInstance(className); // 在dll程序集中 通过className实例化获取子类
Type type1 = obj.GetType().BaseType; // 获取父类类型
Type type2 = typeof(Shape);
Assembly assembly1 = type1.Assembly;
Assembly assembly2 = type2.Assembly;
string codeBase1 = assembly1.CodeBase;
string codeBase2 = assembly2.CodeBase;
try
{shape = (Shape)obj;
}
catch (Exception e)
{throw new Exception("反射创建Shape失败"+ "\n类型直接比较: " + (type1 == type2)+ "\n程序集直接比较: " + (assembly1 == assembly2)+ "\n类型全名比较: " + (type1.FullName == type2.FullName) + ": " + type1.FullName + " " + type2.FullName+ "\n程序集全名比较: " + (assembly1.FullName == assembly2.FullName) + ": " + assembly1.FullName + " " + assembly2.FullName+ "\ncodeBase1: " + codeBase1+ "\ncodeBase2: " + codeBase2+ "\n程序集路径比较: " + (codeBase1 == codeBase2)+ "\ncodeBase1.hash: " + codeBase1.GetHashCode()+ "\ncodeBase2.hash: " + codeBase2.GetHashCode()+ "\n", e);
}

下面是报错结果(其中的敏感字符串被替换成了xxx):

System.Exception: 反射创建Shape失败
类型直接比较: False
程序集直接比较: False
类型全名比较: True: xxx.WpfPlugin.Shape xxx.WpfPlugin.Shape
程序集全名比较: True: xxx.WpfPlugin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null xxx.WpfPlugin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
codeBase1: file:///D:/project/XXX/xxx.xxxClient.UI/xxx.xxxClient.UI/bin/Debug/Plugins/xxx.WpfPlugin.dll
codeBase2: file:///D:/project/XXX/xxx.xxxClient.UI/xxx.xxxClient.UI/bin/Debug/Plugins/xxx.WpfPlugin.dll
程序集路径比较: True
codeBase1.hash: -336973287
codeBase2.hash: -336973287---> System.InvalidCastException: 无法将类型为“xxx.WpfPlugin.Shapes.ImageButton”的对象强制转换为类型“xxx.WpfPlugin.Shape”。在 xxx.WpfPlugin.ctlUI.LoadXml(String xmlPath) 位置 D:\project\XXX\dll\PluginsSources\xxx.WpfPlugin\ctlUI.cs:行号 107--- 内部异常堆栈跟踪的结尾 ---在 xxx.WpfPlugin.ctlUI.LoadXml(String xmlPath) 位置 D:\project\XXX\dll\PluginsSources\xxx.WpfPlugin\ctlUI.cs:行号 111在 xxx.WpfPlugin.ctlUI.DisplayInit() 位置 D:\project\XXX\dll\PluginsSources\xxx.WpfPlugin\ctlUI.cs:行号 177

通过上面的代码可以看出,从子类中获取的父类type,和父类直接获取的type是完全一样的,命名空间,类名称,程序集和对应的dll文件,均相同。但是通过==判断,其在内存中并非同一个对象。

经过排查,发现代码中对该dll加载了两次,获得了两个程序集,而子类和父类分别来自不同的程序集,导致了无法进行类型转换。在修复该dll加载逻辑后问题便得到了解决。

可以推测出,C#判断两个类是否完全相同,除了看命名空间和类名以外,主要是判断两个类是否在同一个程序集实体中(内存中的同一个实体)。若一个dll加载了两遍,获得两个程序集对象,虽然两个程序集中的类完全相同,但是依然无法相互转换。

所以程序集最好有一个公共的存放处,统一的加载逻辑,不要养成需要某个类时直接去加载一遍dll的坏习惯。
也可以通过Assembly.GetExecutingAssembly()直接获取当前代码所在的程序集,避免重复加载。

http://www.yayakq.cn/news/353988/

相关文章:

  • 那个网站可以做雪花特效宁波网站推广排名
  • 校园网站建设招标公告深圳场站建设发展有限公司
  • asp做网站搜索做游戏钓鱼网站
  • 网站备案注销找哪个部门访问网站详细过程
  • 深圳网站建设比较有名的企业wordpress免插件cdn加速
  • 怎么知道公司网站是哪个公司做的列表怎么做网站
  • 网站 框架建设门户网站的目的和意义
  • 教育手机网站开发怎样才能做公司的网站
  • 网站维护运行建设报告婚纱摄影团购网站模板
  • 无锡网站排名哪家好辽宁建设工程信息网评标专家入库
  • 网站开发的结构图网络方案分析
  • 做网站图片知识金华网上商城网站建设
  • 网站建设公司行业现状二手书网站策划书
  • wordpress里验证谷歌站长wordpress文章id排序
  • 汕头做网站设计江西网站设计哪家强
  • 做网站哪家好哪家好开发公司是否可以代建筑公司支付材料款
  • 深圳建立网站wordpress加音乐
  • 多用户商城网站建设扬州市城乡建设网站
  • 呼家楼做网站的公司wordpress 二级目录
  • 漂亮的网站维护页面深圳网站开
  • 湖州高端网站建设快手秒刷自助网站
  • 企业网站建设中期报告模板遵义网站网站建设
  • 在旅行社做网站运营网站建设的方案书
  • 医院网站建设 利法拉网络公司怎么搭建自己网站
  • 门户网站建设摘要零食网站建设的必要性
  • 做网站放广告收益公司网站维护怎么做
  • 做网站需要啥抚顺网络推广
  • 企业建设网站的策划流程大理州建设局门户网站
  • 自己做网站推广产品wordpress采集小说数据
  • 吉林省住房建设保障厅网站电商设计是什么意思