<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    Side by Side Assembly介紹--manifest文件的使用

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    什么是Side-by-Side Assembly?

    Side-by-Side Assembly(建稱SxS)是微軟在Visual Studio 2005(Windows 2000?)中引入的技術,用來解決Windows平臺上的DLL Hell問題。DLL Hell的介紹可以看Wikipedia的文章。簡單的說,DLL Hell窘境包括了Windows應用程序依賴的DLL帶來的若干問題,包括同名DLL、DLL升級、DLL載入順序等等。

    Side-by-Side Assembly按照我的理解,是一種特殊的DLL,按照Side-by-Side Assembly的要求開發的,并用XML格式的manifest和policy文件描述的。所有的系統Side-by-Side Assembly都安裝在Windows目錄下的WinSxS子目錄里,有一堆的目錄、DLL和XML文件。

    Side-by-Side Assembly的使用參見MSDN。但MSDN有把簡單問題復雜化的毛病,原理講的很多,實際例子舉的很少,不看也罷。

    使用Side-by-Side Assembly包括兩個方面,一方面是自己開發的應用程序和DLL如何依賴Side-by-Side Assembly,另一方面是如何開發自己的Side-by-Side Assembly。如果只關心第一個方面,問題要簡單的多。不需要關心第二個方面的原因如下。

    Visual Studio 2010要取消對Side-by-Side Assembly的默認支持?

    消息來源于微軟的博客,根據文章介紹,2010要改變對應用默認采用的SxS發布方式,回到類似2003的方式,同時支持對CRT的靜態和動態聯編,對DLL的搜索順序也是常用的:先搜索應用程序目錄,然后System32,然后PATH。

    當然SxS還是有的,應該只是Visual Studio不再在開發應用時默認采用。

    應用如何依賴Side-by-Side Assembly

    cl.exe在鏈接生成EXE的時候,會同時生成一個同名的manifest文件。該文件是XML格式的,描述了EXE對SxS的依賴。下面是一個manifest的例子:

    <?xmlversion="2.0"encoding="UTF-8"standalone="yes"?>
    <assemblyxmlns="urn:schemas-microsoft-com:asm.v1"manifestversion="1.0">
    <trustinfoxmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
    <requestedprivileges>
    <requestedexecutionleveluiaccess="false"level="asInvoker"></requestedexecutionlevel>
    </requestedprivileges>
    </security>
    </trustinfo>
    <dependency>
    <dependentassembly>
    <assemblyidentityname="Microsoft.VC90.CRT"publickeytoken="1fc8b3b9a1e18e3b"processorarchitecture="x86"version="9.0.21022.8"type="win32"></assemblyidentity>
    </dependentassembly>
    </dependency>
    </assembly>

    如果刪除這個manifest文件,運行該EXE會出現類似下面的錯誤:

    RFID設備管理軟件

    這是因為缺少manifest文件的描述,程序不知道如何載入WinSxS目錄下的DLL。所以最好把manifest文件嵌入EXE中,可以用mt.exe工具完成這一工作:

    mt.exe -manifest <manifest-file> -outputresource:<exe-file>;#1

    用IDE開發不存在這個問題,IDE會自動調用mt.exe將manifest嵌入EXE

    DLL如何依賴Side-by-Side Assembly

    同上述原因,DLL生成之后,最好也用mt.exe將manifest文件嵌入。方法與上面類似,不同之處在資源ID應該是2而不是1,其中的區別參見【1】【2】,硬記也行,沒什么道理。

    mt.exe -manifest <manifest-file> -outputresource:<dll-file>;#2

    用IDE開發也不存在這個問題,IDE會自動調用mt.exe將manifest嵌入DLL

    如何繞過Side-by-Side Assembly?

    Side-by-Side Assembly帶來了很多不便,比如說,依賴SxS MSVCR90.dll的程序在沒有安裝VC redistributable的系統中不能運行,像是WinPE環境。因此最好有一種繞過SxS的方法,將SxS的Assembly和EXE放在一個目錄下,避免依賴系統WinSxS目錄下的Assembly。

    1. 首先,我們需要manifest文件,如果手頭沒有EXE和DLL的manifest文件,可以用mt.exe工具從EXE和DLL中導出manifest文件

    導出EXE的manifest

    mt.exe -inputresource:<exe-file>;#1 -out:<manifest-file>

    導出DLL的manifest

    mt.exe -outputresource:<dll-file>;#2 -out:<manifest-file>

    2. 根據manifest中的信息,創建若干新的manifest文件。新manifest文件名和EXE中依賴的Assembly名字對應,例如按照前面的manifest例子,應該對應創建一個Microsoft.VC90.CRT.manifest,內容格式如下:

    <?xmlversion="2.0"encoding="UTF-8"standalone="yes"?>
    <assemblyxmlns="urn:schemas-microsoft-com:asm.v1"manifestversion="1.0">
    <noinheritable></noinheritable>
    <assemblyidentityname="Microsoft.VC90.CRT"publickeytoken="1fc8b3b9a1e18e3b"processorarchitecture="x86"version="9.0.21022.8"type="win32"></assemblyidentity>
    <filename="msvcr90.dll"></file>
    <filename="msvcp90.dll"></file>
    </assembly>

    其中assemblyIdentity和原EXE的內容要完全一樣。

    3. 根據manifest文件中的assemblyIdentity信息,到系統的WinSxS目錄下的子目錄里找DLL,子目錄名的格式是<processorArchchitecture>-<name>-<publicKeyToken>-<version>-none-xxx。把子目錄下的DLL拷貝到EXE所在的目錄下。把DLL的名字寫入新manifest的file標簽下。

    至此,已經把Assembly放到EXE所在目錄下,EXE也不再依賴系統WinSxS目錄下的Assembly了。

    VC 2005和VC 2008相關的SxS打包

    我把自己系統中WinSxS目錄下所有x86_micosoft.vc開頭的目錄全部拷貝出來,打了個包,以備不時之需。(下載鏈接

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全