微軟的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
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成