Chinaunix首页 | 论坛 | 博客
  • 博客访问: 572764
  • 博文数量: 155
  • 博客积分: 4015
  • 博客等级: 上校
  • 技术积分: 1625
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-18 16:55
文章分类

全部博文(155)

文章存档

2009年(20)

2008年(39)

2007年(66)

2006年(29)

2005年(1)

我的朋友

分类:

2007-10-15 15:28:59

  上午在打开一个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会按一定的路径搜索,加载.若加载的版本和程序清单中的不一致时就会出现类似"程序集清单定义与程序集引用不匹配"报错。
 
 
 
 
 
 
 
 
 
Jerry.Chow
     10/15'07
  
阅读(11508) | 评论(2) | 转发(0) |
0

上一篇:再谈管理

下一篇:随便写写

给主人留下些什么吧!~~

chinaunix网友2009-04-21 10:30:57

这个问题我没有好的解决办法,为些我也问了当前.NET开发的专业人员。回答仍旧是无法很好解决。见2432,2433楼: http://www.cnblogs.com/JeffreyZhao/archive/2006/10/29/ASP_NET_AJAX_Q_and_A.html .net程序清单对其使用的组件版本的依赖确实是[硬性的依赖],很难直接解开。 一般情况下,重新编译一下并不是太难,该问题也不会很突出。 如果该问题真的影响了你,你可以workaround,比如加一个adapter,对原始组件进行封装,将对组件发的消息通过adapter进行转发。这样,如果新的组件来了,你只需要重新编译一下adapter即可。 希望我的回答会有帮助,若有什么需要讨论的,欢迎给我email: Jerry.Chou.Cn#Gmail.com (将#替换为@)

chinaunix网友2009-04-19 11:43:11

.net的CLR在执行一个程序时(如.exe)时或使用一个.dll时,他会首先查看其程序集(.exe或.dll)的程序集清单,找到运行该程序所引用的程序集并加载。.net会按一定的路径搜索,加载.若加载的版本和程序清单中的不一致时就会出现类似"程序集清单定义与程序集引用不匹配"报错。 可这样问题怎么解决呢?难道只能重新编译吗?一个控件升级,那不得所有的用到的项目都得重新编译啊?有好的办法吗?