终于找到了微软的官方文档“
Isolated Applications and Side-by-side Assemblies”,原来是推出XP时就有了的技术。以前只是大概听说,从来没有细琢磨过,原来这么有学问。
这篇“ How To Build and Service Isolated Applications and Side-by-Side Assemblies for Windows XP”文章讲得比较详细,看完基本就了解整个的实现原理和开发步骤了。文章说,.NET Framework也是使用了同样的技术( Simplifying Deployment and Solving DLL Hell with the .NET Framework),只是更简单了。原来如此,我还以为assembly等概念是.NET发明的呢,不过是由它发明光大而已!
总结一下:
使用assembly的好处
1. 一个组件的不同版本可以side by side加载在同一个进程里(当然组件要能处理这种并存的情况)。
2. 不需要注册表就可以使用COM组件。
如何制作一个assembly?
编写一个manifest文件,就可以了,这是最简单的private assembly。如果要share,还需要进行数字签名,以及安装到WinSxS目录下,有点麻烦。
为什么要是使用private assembly?
因为是跟应用程序放在一起,side by side好像意义不大。不过可以为了将来转成share assembly做准备。还有,就是可以使用无需注册表的COM组件。
如何开发一个side by side的assembly?
开发可以在同一个进程里加载一个dll/assembly的不同版本并不容易,你要考虑很多情况。比如避免在不同版本的assembly之间交换数据,因为结构可能不一致。比如,避免使用共享内存以及全局信号量等等。
为什么WinSxS目录会变得越来越大?
看到网上有人说自己的WinSxS目录已经达到十几个G了,真是太夸张了。而有人说,自己的只有十几M。这到底什么回事?
这是因为assembly发布之后就不会更改,如果有Bug修改就发布新的版本,并与就旧版本同时并存。这样就可以保持兼容性,而且安装更新也可以不用重启计算机,总之是很方便了。但是,随着时间的增加,系统和应用程序会不断的进行升级,assembly的版本就会越来越多,占用的硬盘空间自然就会越来越大。
如何更新Assembly?
Side by Side是通过强制指定assembly的版本号来达到版本兼容的,但是那样的话assembly如何更新?如果assembly改变了版本号,那么依赖它的应用程序就不能自动享有更新了。而如果不改变版本号,那么Dll Hell的版本不兼容问题就有冒出来了。
微软使用了Publisher Configuration来解决这个问题,你可以强制要求所有(或者指定)的旧版本自动转到新版本来。这时候,随这新版本assembly发布,同时发布一个Publisher Configuration来强制版本号跳转(Redirect)。这样,已发布的应用程序不需要重新打包和部署,就可以使用新版本的assembly了。当然,新版本的assembly需要保证向后兼容。Publisher Configuration是全局的跳转,也可以为不同的应用程序做不同的跳转,即Application Configuration。两种Configuration都是在不改变现有应用程序的情况下,改变其Assembly之间的绑定关系,适合于Policy式的集中管理。Application Configuration可以覆盖Publisher Confiuration的设定,强制对特定Assembly版本的依赖以保证兼容性--这使得它可能错过Assembly的重要更新。
既要保持不同Assembly之间的隔离,又想要自动更新,这其实是一个两难问题,根本没有完美解,Publisher Configuration和Application Configuration只是给出了一个平衡的解决方案。
小结
在一个复杂的不断演进的系统里,组件版本的管理是个大问题。如何在不改变现有应用的情况下逐渐演进,更是一大挑战。
这篇“ How To Build and Service Isolated Applications and Side-by-Side Assemblies for Windows XP”文章讲得比较详细,看完基本就了解整个的实现原理和开发步骤了。文章说,.NET Framework也是使用了同样的技术( Simplifying Deployment and Solving DLL Hell with the .NET Framework),只是更简单了。原来如此,我还以为assembly等概念是.NET发明的呢,不过是由它发明光大而已!
总结一下:
使用assembly的好处
1. 一个组件的不同版本可以side by side加载在同一个进程里(当然组件要能处理这种并存的情况)。
2. 不需要注册表就可以使用COM组件。
如何制作一个assembly?
编写一个manifest文件,就可以了,这是最简单的private assembly。如果要share,还需要进行数字签名,以及安装到WinSxS目录下,有点麻烦。
为什么要是使用private assembly?
因为是跟应用程序放在一起,side by side好像意义不大。不过可以为了将来转成share assembly做准备。还有,就是可以使用无需注册表的COM组件。
如何开发一个side by side的assembly?
开发可以在同一个进程里加载一个dll/assembly的不同版本并不容易,你要考虑很多情况。比如避免在不同版本的assembly之间交换数据,因为结构可能不一致。比如,避免使用共享内存以及全局信号量等等。
为什么WinSxS目录会变得越来越大?
看到网上有人说自己的WinSxS目录已经达到十几个G了,真是太夸张了。而有人说,自己的只有十几M。这到底什么回事?
这是因为assembly发布之后就不会更改,如果有Bug修改就发布新的版本,并与就旧版本同时并存。这样就可以保持兼容性,而且安装更新也可以不用重启计算机,总之是很方便了。但是,随着时间的增加,系统和应用程序会不断的进行升级,assembly的版本就会越来越多,占用的硬盘空间自然就会越来越大。
如何更新Assembly?
Side by Side是通过强制指定assembly的版本号来达到版本兼容的,但是那样的话assembly如何更新?如果assembly改变了版本号,那么依赖它的应用程序就不能自动享有更新了。而如果不改变版本号,那么Dll Hell的版本不兼容问题就有冒出来了。
微软使用了Publisher Configuration来解决这个问题,你可以强制要求所有(或者指定)的旧版本自动转到新版本来。这时候,随这新版本assembly发布,同时发布一个Publisher Configuration来强制版本号跳转(Redirect)。这样,已发布的应用程序不需要重新打包和部署,就可以使用新版本的assembly了。当然,新版本的assembly需要保证向后兼容。Publisher Configuration是全局的跳转,也可以为不同的应用程序做不同的跳转,即Application Configuration。两种Configuration都是在不改变现有应用程序的情况下,改变其Assembly之间的绑定关系,适合于Policy式的集中管理。Application Configuration可以覆盖Publisher Confiuration的设定,强制对特定Assembly版本的依赖以保证兼容性--这使得它可能错过Assembly的重要更新。
既要保持不同Assembly之间的隔离,又想要自动更新,这其实是一个两难问题,根本没有完美解,Publisher Configuration和Application Configuration只是给出了一个平衡的解决方案。
小结
在一个复杂的不断演进的系统里,组件版本的管理是个大问题。如何在不改变现有应用的情况下逐渐演进,更是一大挑战。