柳永法的.net技术博客

向更高的人生目标奋斗
posts - 10, comments - 103, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

.net DLL之间是通过AssemblyVersion建立引用关系的

Posted on 2011-11-12 18:35 yongfa365 阅读(...) 评论(...) 编辑 收藏

  AssemblyVersion对程序集间的引用很重要,此版本号一般不要随便改,也不要让其自动生成,如果项目很多,类库间引用很多你这么做了的话,很可能把dll搞乱,解释:

  类库ClassA设置:[assembly: AssemblyVersion("1.0.0.*")]

  类库ClassB引用了ClassA

  如果对ClassB重新生成,则ClassB将关联ClassA(假设AssemblyVersion为1.0.0.1),将生成的两个dll文件都Copy到某一目录CommonDLL,然后在ConsoleC项目里引用CommonDLL\ClassB.dll后,生成时会自动引用CommonDLL\ClassA.dll到ConsoleC项目的bin目录下。

  而如果后来单独生成了ClassA.dll(假设AssemblyVersion为1.0.0.2),并替换CommonDLL下的这一个文件,此时生成ConsoleC项目时你会发现只有ClassB.dll而没有ClassA.dll,并且不会生成失败!但运行ConsoleC项目时会报错:
未能加载文件或程序集“ClassA, Version=1.0.0.1, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。

(以上举例是单独生成ClassA.dll,实际中你可能是多个公共的项目又引用了公共的ClassA,而每个项目重新生成时都生成了不同AssemblyVersion的ClassA.dll,然后这些公共的DLL又都被同一个项目引用,最终导致ClassA.dll是哪个类生的,很就乱大了。)

这个过程类似强命名,但又不是强命名,但dll间的引用就是使用这种方式来关联各DLL的。


但我们还是要实现版本功能,以便排错,这时我们可以使用[assembly: AssemblyFileVersion("1.0.5.0")],因为他只是个文件版本号,供人看的,类似备注一类的功能,不参与dll间的引用或者保证每次这些版本间的引用都正确,但这个在开发阶段很难做到,可以在产品发布的时候去做,但柳永法(yongfa365)'Blog觉得如果不是要做成强命名DLL,没必要这么做。

 

首发地址:

.net DLL之间是通过AssemblyVersion建立引用关系

http://www.yongfa365.com/Item/DLL-Reference-By-AssemblyVersion.html