[原]Asp.net替换不同版本的Dll文件碰到的问题以及解决办法.
情景還原: 今天一個(gè)朋友說網(wǎng)站不能上傳圖片,我檢查后發(fā)現(xiàn)一直卡住在上傳頁面,一直滾動(dòng),是個(gè)Fckeditor控件2.6.3的.
???????????? 經(jīng)過google以后得到的結(jié)論是圖片上傳成功,但是沒有返回結(jié)果,在服務(wù)器上可以看到上傳的圖片. 說明是上傳控件有問題,程序不能返回結(jié)果.
???????????? 再google以后發(fā)現(xiàn)有人已經(jīng)修改好了這個(gè)文件,FredCK.FCKeditorV2.dll,大喜,遂替換之,錯(cuò)誤隨之而來.
錯(cuò)誤原因:原來舊版本的dll文件與新版本的dll文件版本號(hào)不一樣,publickeytoken也可能不一樣,導(dǎo)致源程序在發(fā)布的時(shí)候,固定了這個(gè)版本號(hào)與publickeytoken.
解決辦法: 原版的程序沒有源代碼,所以不可能添加新的dll引用,再重新生成網(wǎng)站,所以只能替換. 發(fā)布的bin里面App_Web_0uxqio0i.dll這個(gè)文件引用了FredCK.FCKeditorV2.dll
???????????? 所以只需要修改App_Web_0uxqio0i.dll里面引用的FredCK.FCKeditorV2.dll的版本號(hào)以及publickeytoken就可以了.
原理是利用ildasm反編譯dll,再用ilasm編譯成dll再替換就可以了. 編譯了以后修改其中的版本號(hào)以及publickeytoken.????????????
引用:http://hi.baidu.com/zzyjg/blog/item/e8c0fb11ad932e19b9127be7.html
????????????
上午在打開一個(gè)Asp.net網(wǎng)頁時(shí)出現(xiàn)了這樣的錯(cuò)誤信息: 找到的名為“Infragistics.WebUI.UltraWebGrid.ExcelExport.v3.1”的程序集清單定義與程序集引用不匹配。 其中Infragistics.WebUI.UltraWebGrid.ExcelExport.v3.1是我們程序中用到的第三方控件。我自己也是第一次遇到這樣的問題,咋一看估計(jì)是版本問題。但也不知道真正原因是什么以及該如何解決。上午查找了相應(yīng)的資料將該“報(bào)錯(cuò)”成功解決。 既然是“程序集清單”和“程序集引用”不匹配。那讓我們先來看看什么是“程序集清單”。 什么是程序集清單(Assembly Manifest)? 我們知道,在.net中。程序是以程序集為單位進(jìn)行打包的,通常一個(gè).exe文件或一個(gè).dll文件就是一個(gè)程序集。程序集一般包含了以下幾個(gè)部分: 1,程序集清單(或者叫程序集元數(shù)據(jù)); 2,類型元數(shù)據(jù); 3,MSIL代碼; 4,資源(可選項(xiàng)). 如此說來,一般情況下一個(gè).exe或.dll都會(huì)包含這此內(nèi)容。 具體請(qǐng)參考:http://msdn2.microsoft.com/zh-cn/library/zst29sk2(VS.80).aspx 在程序集中,程序集清單(manifest)是比較重要的,簡(jiǎn)單地講它包含了一個(gè)程序集需要引用的外部分文件及程序集所包含的內(nèi)容。其實(shí)也就是微軟說的“自我說明”。我們可以通過Visual Studio2003自帶的ILDASM工具查看該清單: 1,打開ILDASM,一般位于:VS2003安裝目錄\SDK\v1.1\Bin\目錄下。 2,打開ILDASM,后選擇文件->打開,將想要查看的程序集加進(jìn)來。 3,雙擊“MANIFEST”; 打開后會(huì)看到如下內(nèi)容: 上圖的MANIFEST就是程序清單,像紅線部分標(biāo)出的是該程序集需要引用到外部文件Infragistics.WebUI.UltraWebGrid.ExcelExport.v3.1,同時(shí)也標(biāo)識(shí)了版本號(hào)和密鑰。 至此,我們知道是什么是程序集清單以及怎么樣查看一個(gè)程序集清單了。下面我們?cè)倏纯词裁词浅绦蚣谩? 什么是程序集的引用? 在VS2003下編程的朋友們都知道,當(dāng)我們用第三方控件,或是別人寫的DLL時(shí),我所要做的就是將其引用進(jìn)來。引用一個(gè)程序集的動(dòng)作分為兩步: 首先,在項(xiàng)目中將需要的引用的程序集“添加至”引用中。 其次,在源文件件引入(using namespace)別人的命名空間; 如下: 如此將其引用進(jìn)來以后,我們就可以使用該第三方控件提供的類、方法、資源等功能了。比如我們將“System.Data.SqlClient”引入以后,我們就可以通過其提供的類進(jìn)行數(shù)據(jù)庫的連接及操作了。 現(xiàn)在知道什么是“程序集清單”了,知道什么是“程序集引用”。問題也相對(duì)明了了。程序引用中的第三方控件的版本號(hào)(我這邊是路徑導(dǎo)致的)和最終生成的程序集清單所需的版本號(hào)并不相符。 .net的CLR在執(zhí)行一個(gè)程序時(shí)(如.exe)時(shí)或使用一個(gè).dll時(shí),他會(huì)首先查看其程序集(.exe或.dll)的程序集清單,找到運(yùn)行該程序所引用的程序集并加載。.net會(huì)按一定的路徑搜索,加載.若加載的版本和程序清單中的不一致時(shí)就會(huì)出現(xiàn)類似"程序集清單定義與程序集引用不匹配"報(bào)錯(cuò)。 利用dll轉(zhuǎn)存的.il文件,用記事本修改文件頭部中的版本號(hào)等資料.保存. 版本號(hào)直接右鍵屬性就可以看到了,publickeytoken需要用到命令. 參考http://blog.8384.org/post-470.html使用命令行工具SDK Command Prompt,鍵入:SN -T C:\*****.dll
就會(huì)顯示出該dll具體的PublicKeyToken數(shù)值。
如果該程序集沒有強(qiáng)命名,則不會(huì)有PublicKeyToken數(shù)值。
將一個(gè)程序集強(qiáng)命名的方法是:
用SN -k C:\***.snk命令生成***.snk文件,將該snk文件加載到項(xiàng)目中。在項(xiàng)目上右鍵屬性,選擇Signing選項(xiàng)卡,鉤選中“Sign the assembly”,再在下拉列表中選擇剛才生成的***.snk,重新編譯程序集。
此后,該程序集就被強(qiáng)命名了,它的PublicKeyToken就有相應(yīng)數(shù)值了。
注意要用大寫的-T,不能用小寫的。
公鑰標(biāo)記由應(yīng)用程序簽名時(shí)所用公鑰的SHA-1哈希代碼的最后8個(gè)字節(jié)表示
再用ilasm生成.下面的命令對(duì) MSIL 文件 myTestFile.il 進(jìn)行匯編并產(chǎn)生可執(zhí)行文件 myTestFile.exe.
other 復(fù)制 ilasm myTestFile下面的命令對(duì) MSIL 文件 myTestFile.il 進(jìn)行匯編并產(chǎn)生 .dll 文件 myTestFile.dll。
other 復(fù)制 ilasm myTestFile /dll下面的命令對(duì) MSIL 文件 myTestFile.il 進(jìn)行匯編并產(chǎn)生 .dll 文件 myNewTestFile.dll。
other 復(fù)制 ilasm myTestFile /dll /output:myNewTestFile.dll 這樣一個(gè)經(jīng)過修改的dll文件生成了,再次替換文件.系統(tǒng)成功運(yùn)行.已經(jīng)可以識(shí)別新的版本的dll文件,并進(jìn)行調(diào)用 上傳圖片成功. ilasm 與 ildasm 點(diǎn)這里下載(打包在一起的): http://files.cnblogs.com/cyrix/ildasm.rar轉(zhuǎn)載于:https://www.cnblogs.com/cyrix/articles/2208630.html
總結(jié)
以上是生活随笔為你收集整理的[原]Asp.net替换不同版本的Dll文件碰到的问题以及解决办法.的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转:JNI jstring与c++字符串
- 下一篇: 英语基础语法(八)-时态