上午在打開一個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都會包含這此內容。
在程序集中,
程序集
清單(manifest)是比較重要的,簡單地講它包含了一個程序集需要引用的外部分文件及程序集所包含的內容。其實也就是微軟說的“自我說明”。我們可以通過Visual Studio2003自帶的ILDASM工具查看該清單:
1,打開ILDASM,一般位於:VS2003安裝目錄\SDK\v1.1\Bin\目錄下。
2,打開ILDASM,后選擇
文件->打開,將想要查看的程序集加進來。
3,雙擊“MANIFEST”;
打開后會看到如下內容:

上圖的MANIFEST就是程序清單,像紅線部分標出的是該程序集需要引用到外部文件
Infragistics.WebUI.UltraWebGrid.ExcelExport.v3.1,同時也標識了版本號和密鑰。
至此,我們知道是什么是程序集清單以及怎么樣查看一個程序集清單了。下面我們再看看什么是程序集引用。
什么是程序集的引用?
在VS2003下編程的朋友們都知道,當我們用第三方控件,或是別人寫的DLL時,我所要做的就是將其引用進來。引用一個程序集的動作分為兩步:
首先,在項目中將需要的引用的程序集“添加至”引用中。
其次,在源文件件引入(using namespace)別人的命名空間;
如下:

如此將其引用進來以后,我們就可以使用該第三方控件提供的類、方法、資源等功能了。比如我們將“System.Data.SqlClient”引入以后,我們就可以通過其提供的類進行數據庫的連接及操作了。
現在知道什么是“程序集清單”了,知道什么是“程序集引用”。問題也相對明了了。程序引用中的第三方控件的版本號(我這邊是路徑導致的)和最終生成的程序集清單所需的版本號並不相符。
.net的CLR在執行一個程序時(如.exe)時或使用一個.dll時,他會首先查看其程序集(.exe或.dll)的程序集清單,找到運行該程序所引用的程序集並加載。.net會按一定的路徑搜索,加載.若加載的版本和程序清單中的不一致時就會出現類似"程序集清單定義與程序集引用不匹配"報錯。