本文简要介绍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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!