凡科轻站小程序收费吗,西安高端品牌网站建设,江西手机版建站系统开发,网络营销推广策划这个过程是这样的。有一个遗留的项目需要做一些修改#xff0c;那么我就从TFS上把这个项目下载下来#xff0c;用VisualStudio打开。编译时没有发现错误#xff0c;直接运行。可是运行时就抛出了异常。
Could not load file or assembly log4net, Version1.2.10.0, Culture…这个过程是这样的。有一个遗留的项目需要做一些修改那么我就从TFS上把这个项目下载下来用VisualStudio打开。编译时没有发现错误直接运行。可是运行时就抛出了异常。
Could not load file or assembly log4net, Version1.2.10.0, Cultureneutral, PublicKeyToken1b44e1d426115821 or one of its dependencies.
The located assemblys manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040):log4net, Version1.2.10.0, Cultureneutral, PublicKeyToken1b44e1d426115821}我的第一反应是这个Log4Net.dll找不到觉得那么在reference列表中这个dll应该是黄色才对。右键查看项目引用的dll发现Log4Net.dll正常引用并没有黄色叹号说明找到了这个dll.(后来想想也对如果有黄色叹号标记的dll,那么说明找不到这个dll那么编译的时候就应该报出异常说找不到这个dll所以由此总结带黄色叹号的都是项目要用到的但是没有在本地找到的编译不会通过。如果没有黄色叹号抛出上边的异常那么就是这个dll找到了但是可能版本不一致。)
双击reference列表中的Log4Net.dll可以看到其详细的信息可以看出这个dll指向的路径是GAC中那么我就去GAC中找确实在我本机找到了。 这个程序集存在于GAC中。那么我们查看一下这个Log4Net的dll信息。 果然这里的publicKey Token与所需要的PublicKeyToken1b44e1d426115821不一致。那么怎么解决这个问题以前记得解决DLLversin不一样问题的时候可以使用web.config或者app.config中的runtime节点进行redirect映射那么publicTokenKey 可以吗我找了找没有找到相关配置。怎么办 那么就去找指定publicKey token的dll吧。去哪里找去Log4Net的官网找。确实官网说明了它的dll变过publicKey token. 不过一般来讲一个公司发布产品类型的dll,本不应该变换publickey Token签名的否则会给用户带来像本文提到的这种问题不同的人机器人可能安装了不同publickeytoken的签名版本造成混乱。但是不知道为什么Log4Net却中途变了这个签名有newkey与oldkey版本。
我下载了new key的版本觉得这个应该是项目需要的但是怎么确定一下这个下载来的dll的publickkeytoken呢这里就可以用VS自带的工具。打开VS命令行输入sn命令就可以。 由此可以看到这个publickey token不是。所以继续下载了oldkey的dll,使用同样的方法最终证实确实是需要oldkey的版本。所以我下载下来这个Log4Net.dll然后在项目中建立一个Lib目录把dll放进去让项目对其添加引用。publickeyToken对了此时我们需要看一下那么版本对吗右键查看这个新引用的dll的property发现版本还真不对。项目需要Version1.2.10.0而这个新下载的是1.2.13.0那么怎么办这时就可以用版本映射来解决了。打开配置问题件在节点中增加这些信息意思就是需要1.2.10.0的时候如果遇到了1.2.13.0那么就可以认为找到了对应的dll。 至此编译运行发现问题解决没有再报任何的异常。 一些题外话 以上的问题都是由于项目开发时候的不规范造成的。像Log4Net这样的非微软集成到GAC中的dll就应该在项目中建立一个Lib目录存储下来以后当有人下载代码的时候能够连带dll一起下载到本地不用再大费周章的去找对应版本了。现在有时候是用Nuget就很好那么额外的dll全会放到package中并且include到项目中。 还有关于dll version的映射问题这个不是什么时候都OK的。
比如说现在我用到了一个第三方的dll叫做SuperLog.dll这个dll是一个公司的产品这个公司是引用EntrepriseLogging.dll,引用的是5.0的版本并且在这个基础之上增加功能。我们在一个项目中用到了SuperLog.dll我们加入这个SuperLog.dll编译时告诉我们需要引入EntrepriseLogging.dll但是我们手头只有EntrepriseLogging.dll6.0的版本。或许我们可以引入6.0的版本但是重新映射到5.0版本。但是我们这样做了编译的时候还是遇到了问题。异常好像是说EntrepriseLogging没有某个方法之类的。所以这个意思就是说以前5.0的时候可能有一个方法A(),正好被SuperLog调用了。但是在6.0版本的时候EntrepriseLogging决定不要这个方法了。所以在我们项目中虽然没有抛出版本不一样的异常但是当把6.0的版本当5.0的用对这个6.0版本掉用A方法但是没有就抛出了异常。 一般来讲第三方DLL发布新的版本基本上不会更新对外暴露的方法只是会更新方法中的内容。所以不管哪个版本我们用到的都是同一个方法。但是如果真的对外的方法都变了增加了活减少了什么的那么就会遇到上边的问题。所以不是所有的版本不同问题都能通过配置映射来解决。 为什么要有PublickKey Token?
其中一个很重要的原因就是安全角度考虑。这样说吧某公司开发了一个桌面程序A.exe然后安装包供下载。你下载完成并且安装。那么在你的ProgramFile里边就有A.exe与一些供其调用的dll比如说B.dll,当你运行A的时候会调用B.dll完成相应操作。现在如果有某个非法程序偷偷的跑到A的目录中找到B.dll然后把自己写的同名的dll替换原来的。这时运行A的时候调用B就可能会有一些恶意非法操作。PublicKey的作用之一就是用来验证B是否是完全一致的B。验证机制比较复杂大家可以进一步探索。