微软的Dll管理方案及其变迁(Side-by-side assembly)
本文简要介绍Side-by-side assembly技术,探讨在插件技术中使用类似方法的可能。
什么是Side-ty-side Assembly
Side-by-side assembly是Windows Xp及以上系统解决动态链接库版本冲突所使用的技术,要点是编译程序时,由Visual Studio生成一个manifest文件,指明本应程序所使用的动态链接库的版本;发布程序时也要发布该manifest文件,供客户计算机上的dll loader根据manifest加载适当版本的dll,如果不发布该项manifest,客户机按默认版本加载Dll。

Representation of typical side-by-side assembly
http://msdn.microsoft.com/en-us/library/aa376307.aspx
引自MSND网站
如下所示是一个用VS2008编译应用程序后生成的manifest文件,重点是指明了Microsoft.VC90.CRT的版本号,即本程序所用C和C++的动态链接库的版本号。
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>
对软件发布的影响
发布这个应用程序时,要确保相同版本的动态库安装到客户的计算机上,所以要用微软提供的相应的redistributable packege,注意VS和VS SP的动态库是不一样的,但VS会默认用VS提供的版本。与此相关的问题是编译器有权为应用程序指定所需的动态链接库的版本,而C和C++的运行时库与VC的版本时相关的,关于如何设置可参考 http://msdn.microsoft.com/en-us/library/cc664727%28v=VS.90%29.aspx
另一方面,应用程序除用到微软的dll之外,还会用到第三方库,这时确保所有库都能访问到正确版本的运行时库就变得非常重要了。
在插件技术中应用类似方法
在VS2010中,微软已放弃这种方法,而是在DLL文件后加了一个版本号,同名的DLL只要版本号不同,以后也视为两个DLL。独立于操作系统插件系统,其中一定会有一个模块起到Dll Loader的作用,能够允许不同版本的同名插件同时存在在系统中有助于软件系统的升级,有助于及时快速地满足用户的需要。参见 http://en.wikipedia.org/wiki/Side-by-side_assembly
微软的Dll管理方案及其变迁(Side-by-side assembly)的更多相关文章
- C# 程序异常管理方案
C# 程序异常管理方案 1.程序出现未处理异常(程序中未捕获异常.添加异常处理) 2.程序添加全局异常捕获 tip:程序已处理异常不在捕获范围内. /// <summary> /// 应用 ...
- 【干货】快速部署微软开源GPU管理利器: OpenPAI
[干货]快速部署微软开源GPU管理利器: OpenPAI 介绍 不管是机器学习的老手,还是入门的新人,都应该装备上尽可能强大的算力.除此之外,还要压榨出硬件的所有潜力来加快模型训练.OpenPAI作为 ...
- (转)flutter 新状态管理方案 Provide (一)-使用
flutter 新状态管理方案 Provide (一)-使用 版权声明:本文为博主原创文章,基于CC4.0协议,首发于https://kikt.top ,同步发于csdn,转载必须注明出处! ...
- C# 通用数据库配置界面,微软原生DLL重整合
C# 通用数据库配置界面,微软原生DLL重整合 自己整合了 微软自带的数据连接配置界面对话库 Microsoft.Data.ConnectionUI.Dialog.dll 微软自带的数据连接配 ...
- 微软URLRewriter.dll的url重写在目标框架.Net Framework2.0、4.0和应用程序池经典模式、集成模式下的配置
大家参考几篇园子里面的这篇文章: 文章1:微软URLRewriter.dll的url重写的简单使用 (讲解了使用UrlReWriter.dll的下载.web.config如何在目标框架2.0应用程序池 ...
- 【云计算】Docker 多进程管理方案
docker容器内多进程的管理方案 时间 2015-05-08 00:00:00 涯余 ...
- vuex-- Vue.的中心化状态管理方案(vue 组件之间的通信简化机制)
vuex-- Vue.的中心化状态管理方案(vue 组件之间的通信简化机制) 如果你在使用 vue.js , 那么我想你可能会对 vue 组件之间的通信感到崩溃 .vuex就是为了解决组件通信问题的. ...
- 【云计算】Docker多进程管理方案-cfengine && supervisord
docker容器内多进程的管理方案 时间 2015-05-08 00:00:00 涯余 原文 http://yayua.github.io/docker/container-process-moni ...
- 工业控制系统USB存储设备可信管理方案的(ICICS2015)论文PPT:TMSUI: A Trust Management Scheme
本PPT是发表在ICICS2015 大会的论文 TMSUI: A Trust Management Scheme of USB Storage Devices for Industrial Contr ...
随机推荐
- kettle列转行
- windows server 2008下装SQL 2008R2x64
1. 在windows server 2008下装SQL 2008出现 This SQL Server Setup media is not supported on a X64 system 使用虚 ...
- 在Ubuntu下配置Apache多域名服务器
1. 目标: 在本机 实现访问不同域名 可以访问不同的目录. 即:访问a.com 进入 /var/www/a 目录下的程序,访问b.com 进入/var/www/b目录下的程序. 2.遇到的问题: / ...
- C#中的二进制序列化和Json序列化
序列化就是把一个对象变成流的形式,方便传输和还原.小弟不才,总结下对二进制序列化和Json序列化的使用: 1.首先,二进制序列化(BinaryFormatter)要求要序列化的类必须是可序列化的(即在 ...
- Contoso 大学 - 8 – 实现继承
原文 Contoso 大学 - 8 – 实现继承 By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Microsoft's W ...
- ios 微信细节
1.登录后,下次登录保存其用户名. * 官方的登录实现 * 1.把用户名和密码放在沙盒 NSString *user = self.userField.text; NSStri ...
- 设置TextView文字居中
有2种方法可以设置TextView文字居中: 一:在xml文件设置:android:gravity="center" 二:在程序中设置:m_TxtTitle.setGravity( ...
- JS面向对象5中写法
//定义Circle类,拥有成员变量r,常量PI和计算面积的成员函数area() //第1种写法 function Circle(r) { this.r = r; } Circle.PI = 3.14 ...
- 1.6建造者模式(生成器模式) Builder
1.概念:将一个复杂对象的构建和他的表示分离,使得同样的构件可以创建不同的表示. 2.实例:肯德基和中餐,肯德基抽象了整个做菜的复杂过程(相同的构建),然后在不同的店铺进行实现(不同的表示).中餐往往 ...
- Qt实现桌面动态背景雪花飘落程序
曾经收到过一份礼物,一个雪花飘落的程序,觉得效果很炫,通过前几篇的学习,我们已经掌握了贴图的一些技巧了,那么现在就可以自己实现了(当然你必须先拥有qt信号与槽的基础知识),这里先看效果 ...