[原]Asp.net替换不同版本的Dll文件碰到的问题以及解决办法.

情景还原: 今天一个朋友说网站不能上传图片,我检查后发现一直卡住在上传页面,一直滚动,是个Fckeditor控件2.6.3的.

             经过google以后得到的结论是图片上传成功,但是没有返回结果,在服务器上可以看到上传的图片. 说明是上传控件有问题,程序不能返回结果.

             再google以后发现有人已经修改好了这个文件,FredCK.FCKeditorV2.dll,大喜,遂替换之,错误随之而来.

错误原因:原来旧版本的dll文件与新版本的dll文件版本号不一样,publickeytoken也可能不一样,导致源程序在发布的时候,固定了这个版本号与publickeytoken.

解决办法: 原版的程序没有源代码,所以不可能添加新的dll引用,再重新生成网站,所以只能替换. 发布的bin里面App_Web_0uxqio0i.dll这个文件引用了FredCK.FCKeditorV2.dll

             所以只需要修改App_Web_0uxqio0i.dll里面引用的FredCK.FCKeditorV2.dll的版本号以及publickeytoken就可以了.

原理是利用ildasm反编译dll,再用ilasm编译成dll再替换就可以了. 编译了以后修改其中的版本号以及publickeytoken.            

引用:http://hi.baidu.com/zzyjg/blog/item/e8c0fb11ad932e19b9127be7.html

            

上午在打开一个Asp.net网页时出现了这样的错误信息:
找到的名为“Infragistics.WebUI.UltraWebGrid.ExcelExport.v3.1”的程序集清单定义与程序集引用不匹配
其中Infragistics.WebUI.UltraWebGrid.ExcelExport.v3.1是我们程序中用到的第三方控件。我自己也是第一次遇到这样的问题,咋一看估计是版本问题。但也不知道真正原因是什么以及该如何解决。上午查找了相应的资料将该“报错”成功解决。
既然是“程序集清单”和“程序集引用”不匹配。那让我们先来看看什么是“程序集清单”。
什么是程序集清单(Assembly Manifest)?
我们知道,在.net中。程序是以程序集为单位进行打包的,通常一个.exe文件或一个.dll文件就是一个程序集。程序集一般包含了以下几个部分:
1,程序集清单(或者叫程序集元数据);
2,类型元数据;
3,MSIL代码;
4,资源(可选项).
如此说来,一般情况下一个.exe或.dll都会包含这此内容。
具体请参考:http://msdn2.microsoft.com/zh-cn/library/zst29sk2(VS.80).aspx
在程序集中,程序集清单(manifest)是比较重要的,简单地讲它包含了一个程序集需要引用的外部分文件及程序集所包含的内容。其实也就是微软说的“自我说明”。我们可以通过Visual Studio2003自带的ILDASM工具查看该清单:
1,打开ILDASM,一般位于:VS2003安装目录\SDK\v1.1\Bin\目录下。
2,打开ILDASM,后选择文件->打开,将想要查看的程序集加进来。
3,双击“MANIFEST”;
打开后会看到如下内容:
11680_071015152938.gif
上图的MANIFEST就是程序清单,像红线部分标出的是该程序集需要引用到外部文件Infragistics.WebUI.UltraWebGrid.ExcelExport.v3.1,同时也标识了版本号和密钥。
至此,我们知道是什么是程序集清单以及怎么样查看一个程序集清单了。下面我们再看看什么是程序集引用。
什么是程序集的引用?
在VS2003下编程的朋友们都知道,当我们用第三方控件,或是别人写的DLL时,我所要做的就是将其引用进来。引用一个程序集的动作分为两步:
首先,在项目中将需要的引用的程序集“添加至”引用中。
其次,在源文件件引入(using namespace)别人的命名空间;
如下:
11680_071015154442.gif
如此将其引用进来以后,我们就可以使用该第三方控件提供的类、方法、资源等功能了。比如我们将“System.Data.SqlClient”引入以后,我们就可以通过其提供的类进行数据库的连接及操作了。
现在知道什么是“程序集清单”了,知道什么是“程序集引用”。问题也相对明了了。程序引用中的第三方控件的版本号(我这边是路径导致的)和最终生成的程序集清单所需的版本号并不相符。
.net的CLR在执行一个程序时(如.exe)时或使用一个.dll时,他会首先查看其程序集(.exe或.dll)的程序集清单,找到运行该程序所引用的程序集并加载。.net会按一定的路径搜索,加载.若加载的版本和程序清单中的不一致时就会出现类似"程序集清单定义与程序集引用不匹配"报错。
利用dll转存的.il文件,用记事本修改文件头部中的版本号等资料.保存.
版本号直接右键属性就可以看到了,publickeytoken需要用到命令. 参考http://blog.8384.org/post-470.html

使用命令行工具SDK Command Prompt,键入:SN -T C:\*****.dll

就会显示出该dll具体的PublicKeyToken数值。

如果该程序集没有强命名,则不会有PublicKeyToken数值。

将一个程序集强命名的方法是:

用SN -k C:\***.snk命令生成***.snk文件,将该snk文件加载到项目中。在项目上右键属性,选择Signing选项卡,钩选中“Sign the assembly”,再在下拉列表中选择刚才生成的***.snk,重新编译程序集。

此后,该程序集就被强命名了,它的PublicKeyToken就有相应数值了。

注意要用大写的-T,不能用小写的。

公钥标记由应用程序签名时所用公钥的SHA-1哈希代码的最后8个字节表示

再用ilasm生成.

下面的命令对 MSIL 文件 myTestFile.il 进行汇编并产生可执行文件 myTestFile.exe.

other
复制
ilasm myTestFile

下面的命令对 MSIL 文件 myTestFile.il 进行汇编并产生 .dll 文件 myTestFile.dll

other
复制
ilasm myTestFile /dll 

下面的命令对 MSIL 文件 myTestFile.il 进行汇编并产生 .dll 文件 myNewTestFile.dll

other
复制
ilasm myTestFile /dll /output:myNewTestFile.dll
这样一个经过修改的dll文件生成了,再次替换文件.系统成功运行.已经可以识别新的版本的dll文件,并进行调用
上传图片成功.
ilasm 与 ildasm 点这里下载(打包在一起的):
http://files.cnblogs.com/cyrix/ildasm.rar

转载于:https://www.cnblogs.com/cyrix/articles/2208630.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

叠筐

Problem Description 需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。 Input 输入是一个个的三元组,分别是,外筐尺寸n&#xff…

“Visual Studio.net已检测到指定的Web服务器运行的不是Asp.net1.1版。您将无法运行Asp.net Web应用程序或服务”问题的解决方案...

解决方案一: 1.确定有安装.net framework 1.1,可以查看目录,c:\winnt\microsoft.net\framework重启IIS,重启计算机(常规纠错方法) 2.如果你的Web服务器使用了固定IP:确定你的“Internet信息服务…

【桶】220.存在重复元素 III 【LeetCode】

220.存在重复元素 III 【LeetCode】 给你一个整数数组 nums 和两个整数 k 和 t。请你判断是否存在 两个不同下标i和j&#xff0c;使得 abs(nums[i] - nums[j]) < t&#xff0c;同时又满足 abs(i - j) < k。 如果存在则返回 true&#xff0c;不存在返回 false。 示例 1…

远控免杀专题12--Green-Hat-Suite免杀

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

英语基础语法(八)-时态

英语中&#xff0c;动词时态的用法是尤其复杂和富于变化的。经常通过动词词尾、组动词等的变化表明动作发生时间的先后顺序&#xff0c;即时态。总的来说&#xff0c;英语中的动词时态分为 三个基本类型&#xff1a; 现在、过去和将来。动词时态的变化常常伴随着相应的表示时间…

Java PushbackInputStream markSupported()方法与示例

PushbackInputStream类markSupported()方法 (PushbackInputStream Class markSupported() method) markSupported() method is available in java.io package. markSupported()方法在java.io包中可用。 markSupported() method is used to check whether this stream supports …

面型对象 (接口与类的区别)

public class Demo4_Interface {public static void main(String[] args) {某女星 clown new 某女星();clown.潜规则();clown.关系();} }/*亲爹只有一个&#xff0c;是单继承;干爹可以有很多个&#xff0c;是多实现;*/ interface 某干爹{public void 关系();public void 潜规…

远控免杀专题 13----zirikatu免杀

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

UML 的九种模型图

1. UML的模型图 UML 的模型图能够将被建模的系统的某一个方面的某一部分以图形的方式表示出来&#xff0c;不同的视图通过将多个不同的模型图有机组合在一起就能够描述系统模型的某方面的特征。UML的模型图是有模型元素构成的&#xff0c;模型元素以图标的形式直观形象的表达…

【莫队】区间众数(Codeforces Round #716 (Div. 2) D)

D. Cut and Stick &#xff08;赛后补题&#xff09;借本题学习莫队算法以及区间众数的求法 题意&#xff1a;对于整型数组&#xff0c;每次询问[L,R][L,R][L,R]区间问最少分为多少个子序列&#xff0c;使得每个子序列的众数xxx的个数cntxcnt_xcntx​不大于 ⌈len2⌉\left \l…

如何正确使用SqlConnection

以前曾见过有人这样写代码&#xff1a; public class Service1 : IService1{private SqlConnection conn new SqlConnection();public void Method1(){//do something with conn;}public void Method2(){//do something with conn;}public void Method3(){//do something with…

关系代数基本运算_关系代数的基本和附加运算

关系代数基本运算Definition 定义 Every DBMS must define a query language to enable users to access the data which is stored in the database. Relational Algebra is a procedural query language. It is used to query the database tables in order to access data…

远控免杀专题 14 ---AVIator

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

面型对象 (包package)

面向对象(package关键字的概述及作用) 为什么要有包 将字节码(.class)进行分类存放 包其实就是文件夹 代码如下&#xff1a; package beyond.hjj;//在当前运行目录下创建一个子目录结构beyond\hjj&#xff0c;在子目录下存放已经编译成字节码文件的clown.class类。 class c…

【Web开发】级联查询(Ajax/ jQuery/ Servlet)

实现级联查询 共有两个下拉框&#xff0c;第一级为学院&#xff0c;第二级为学院开设的科目。 实现的功能为&#xff1a;当改变学院的选择&#xff0c;第二级下拉框需变为对应学院开设的科目内容。 结果预览&#xff1a; jsp页面 <% page contentType"text/html;…

asp.net treeView绑定

这个东西不是什么复杂的东西&#xff0c; 帮着小兄弟写个Demo, 实现个Binding public partial class _Default : System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Bind(); } } priv…

关于TOmcat的一些小小的知识

web.xml中的url-pattern和form 表单中的action是相同的。form 表单中的action声明的并不是servlet的名字 例&#xff1a; <servlet> <servlet-name>welcome</servlet-name> <servlet-class>WelcomeYou</servlet-class> </servlet> <ser…

Java文件类字符串getAbsolutePath()方法(带示例)

文件类字符串getAbsolutePath() (File Class String getAbsolutePath()) This method is available in package java.io.File.getAbsolutePath(). 软件包java.io.File.getAbsolutePath()中提供了此方法。 This method is used to return the absolute path of the file object …

远控免杀专题(15)-DKMC免杀

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

面向对象(静态成员内部类的调用)

class beyond{public static void main(String []args){//外部类名.内部类名 对象名 外部类名.内部类对象(new 内部类名)/*Outer.Inner yy Outer.new Inner(); 类里面有个非静态方法&#xff0c;需要new创建Inner对象;正常的形式是这样的&#xff0c;但是我们习惯将new放在前…