导航
第十九章 Libraries, Assemblies, Packages and NuGet
19.1 库的地狱 423
类库允许你在不同应用中进行代码复用。在Windows系统中,类库拥有悠久的历史,它的体系架构指南(architecture guidelines)为更新的技术提供了不少参考(take different directions)。在.NET之前,动态链接类库(dynamic link libraries,DLLS)可以在不同应用程序之间共享。这些DLLs可以安装在一个共享目录中。在同一个系统中,这些DLLs不允许存在不同版本,他们只能向前兼容(upward compatible)。当然,情况并非总是如此。如果你在安装新的应用程序的时候,没有仔细阅读旧程序的指南,不小心替换了它的某个共享类库。恭喜你,将会面临DLL地狱。
.NET试图用程序集(assemblies)来解决这个问题。程序集和类库都可以被共享。与普通DLL不同的是,程序集包含了扩展的元数据信息,是带有版本号的类库,这样就可以在全局程序集缓存(global assembly cache)里,同时安装多个不同版本的类库。Microsoft试图通过这种方式来修复版本问题,但是这样子反而增加了另外一层复杂度。
让我们假设你现在有一个应用程序X,并且它需要调用两个类库,一个A和一个B。如下图所示,X引用了1.1版本的类库A和1.0版本的类库B,这个时候,B还引用了1.0版本的类库A。因为一个进程里只能加载一个版本的类库,那么哪个版本的A会被加载?假如B先被调用,那么1.0版本的A类库就先被装载到进程里了。这个时候X程序自己又要调用A的话,问题就来了。