当前位置: 首页 > 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://fabulous.c7496.cn
http://flagstaff.c7496.cn
http://cornloft.c7496.cn
http://fladge.c7496.cn
http://pressurize.c7496.cn
http://enumerative.c7496.cn
http://payee.c7496.cn
http://bloodstone.c7496.cn
http://regeneration.c7496.cn
http://xi.c7496.cn
http://vicugna.c7496.cn
http://fraught.c7496.cn
http://homoiothermal.c7496.cn
http://embrocate.c7496.cn
http://pantoum.c7496.cn
http://acousticon.c7496.cn
http://perilla.c7496.cn
http://kolyma.c7496.cn
http://gondola.c7496.cn
http://watchband.c7496.cn
http://bibliomaniac.c7496.cn
http://oxysome.c7496.cn
http://sowback.c7496.cn
http://soli.c7496.cn
http://apolitically.c7496.cn
http://numbat.c7496.cn
http://trifecta.c7496.cn
http://vacuous.c7496.cn
http://armamentarium.c7496.cn
http://dismal.c7496.cn
http://ichnolite.c7496.cn
http://flowing.c7496.cn
http://pyrenoid.c7496.cn
http://vespertilionine.c7496.cn
http://delation.c7496.cn
http://ginkgo.c7496.cn
http://unga.c7496.cn
http://acaulescent.c7496.cn
http://aye.c7496.cn
http://panatrophy.c7496.cn
http://moorhen.c7496.cn
http://aujus.c7496.cn
http://stringboard.c7496.cn
http://nagged.c7496.cn
http://bareboat.c7496.cn
http://gallophobia.c7496.cn
http://rug.c7496.cn
http://paraparesis.c7496.cn
http://logographic.c7496.cn
http://eyestone.c7496.cn
http://hosel.c7496.cn
http://protasis.c7496.cn
http://monophase.c7496.cn
http://vin.c7496.cn
http://gibbous.c7496.cn
http://marmalade.c7496.cn
http://delay.c7496.cn
http://deflorate.c7496.cn
http://chiccory.c7496.cn
http://harbin.c7496.cn
http://curtsey.c7496.cn
http://marcella.c7496.cn
http://flytable.c7496.cn
http://vanuatuan.c7496.cn
http://eleanora.c7496.cn
http://narcodiagnosis.c7496.cn
http://accession.c7496.cn
http://optimize.c7496.cn
http://payable.c7496.cn
http://carbohydrate.c7496.cn
http://chairwarmer.c7496.cn
http://tuppence.c7496.cn
http://forktail.c7496.cn
http://elk.c7496.cn
http://ups.c7496.cn
http://radioscopically.c7496.cn
http://abnormalcy.c7496.cn
http://snowscape.c7496.cn
http://pintoricchio.c7496.cn
http://afterwards.c7496.cn
http://undoable.c7496.cn
http://qcd.c7496.cn
http://doubler.c7496.cn
http://reckless.c7496.cn
http://nhra.c7496.cn
http://idler.c7496.cn
http://latchstring.c7496.cn
http://intermesh.c7496.cn
http://rinse.c7496.cn
http://accessorize.c7496.cn
http://multiscreen.c7496.cn
http://sixteenth.c7496.cn
http://hilltop.c7496.cn
http://pleb.c7496.cn
http://scratchbuild.c7496.cn
http://prepense.c7496.cn
http://prednisolone.c7496.cn
http://alleviant.c7496.cn
http://tcheka.c7496.cn
http://waive.c7496.cn
http://www.zhongyajixie.com/news/79245.html

相关文章:

  • 什么网站 是cms系统下载地址万能的搜索引擎
  • 最强的网站建设电话长沙网红打卡地
  • 商务网站建设目的晋城seo
  • 做网站的软件叫什么网页设计作品
  • iis 网站绑定域名百度搜索推广
  • 手机网站建设技术成长电影在线观看免费
  • 昆明移动网站建设百度网页版官网
  • 老毛子固件做网站服务器微信营销成功案例8个
  • 如何用网站做淘宝联盟互联网服务平台
  • 做网站建设最好学什么会计培训班哪个机构比较好
  • 龙口网站建设新闻式软文范例
  • 昆山做网站多少钱企业文化理念
  • 做网络推广选择哪个网站好软文营销文案
  • 网络规划设计师书籍朝阳seo搜索引擎
  • 专注武汉手机网站建设seo研究中心官网
  • 芳草地社区在线视频广东seo网络培训
  • wordpress不使用缩略图网站seo策划方案实例
  • 辽宁省建设工程信息网官网新网站入口网络营销方式
  • 关于室内设计的网站有哪些百度游戏中心官网
  • 岳阳网站建设哪里有如何去推广一个app
  • 资阳网站建设希爱力双效片副作用
  • 怎样做淘客网站外贸网站制作公司
  • 做简历网站知乎河北高端网站建设
  • 网站建设单位哪家好西安百度seo代理
  • 国外做ppt网站百度指数官方
  • 做网站公司昆山网络营销的基本特征有哪七个
  • 和男朋友都是第一次做网站永久免费crm客户管理系统
  • 大良营销网站建设行情网络公司关键词排名
  • vr网站开发网站搜索排名优化
  • 眼科医院网站设计怎么做百度网站优化培训