2013-04-12 157 views
1

背景:位於C:\windows\Winsxs文件夾 什麼是在WinSxS文件夾中的文件夾名稱的含義(窗口運行時組件目錄)

  • 內WINSXS

    • 的Windows共享的運行時庫,有兩個重要的子文件夾也位於policiesManifests
    • 除此之外,還有大量的運行時程序集位於彼此相鄰的子文件夾中。
    • Winsxspolicies中的所有子文件夾具有相同的命名格式。

    如文件夾名稱:

    • 運行次數:x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_6f74963e
    • 政策:x86_policy.9.0.Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_x-ww_b7353f75

    當我知道這個名字的第一部分(x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729 .1)描述「processorArchitecture」(x86),「Name」(Microsoft.VC90.CRT),「publicKeyToken」(1fc8b3b9a1e18e3b)和大會或政策的「版本」(9.0.30729.1)。

    問: 什麼是組件(x-ww_6f74963e)或政策的最後部分(x-ww_b7353f75)文件夾名稱描述?


    好的這裏是原始問題(但相當長的故事)。我在Windows XP計算機中部署了我的C++ MFC應用程序,該計算機以前安裝了一些C++重新分發包和一些運行時程序集的安全修補程序。因此,這些預安裝的C++重新分發包在Winsxs/policies中自動部署了一些運行時策略。這些策略強制使用新的運行時程序集,而不是由我的應用程序使用和部署。但有些時候,由於其他應用程序刪除或程序集可能會損壞這些較新的DLL。所以我找到了一種方法來部署特別用於我的應用程序的運行時程序集(這意味着我的應用程序必須使用曾經部署的應用程序並忽略策略)。所以我認爲子目錄名稱的最後部分與應用程序的身份相關聯。我需要找到它。

  • +0

    首先,標記濫用......我非常肯定MSDN是你可以弄明白的地方。 – Yang

    +0

    'tag abuse'是什麼意思?那裏有任何不相關的標籤? –

    +0

    這個問題的實際應用是什麼?我原以爲文件夾名稱是一個實現細節,其重要性與微軟以外的任何人無關。 –

    回答

    3

    如果你不能信任全局緩存(在WinXP上它很容易破壞它),你可能必須安裝程序集的私人副本並在你的應用程序配置中覆蓋它們。

    這裏是我使用重寫某些組件用於調試目的的黑客:

    在你的EXE文件夾,刪除名爲yourexename.exe.config與政策信息重定向實際的彙編版本,將不會存在什麼文件在全局緩存中。例如:

    <configuration> 
        <windows> 
         <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
          <dependentAssembly> 
           <assemblyIdentity type="win32" name="someassemblyname" processorArchitecture="x86" publicKeyToken="sometoken"/> 
           <bindingRedirect oldVersion="1.0.0.0-1.0.999.998" newVersion="1.0.999.999"/> 
          </dependentAssembly> 
         </assemblyBinding> 
        </windows> 
    </configuration> 
    

    拿,你要使用,把它放到同一個文件夾,並編輯清單有你上面使用的版本的程序集的內容。例如

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
        <noInheritable></noInheritable> 
        <assemblyIdentity type="win32" name="someassemblyname" version="1.0.999.999" processorArchitecture="x86" publicKeyToken="sometoken"></assemblyIdentity> 
        <file name="somedll.dll"/> 
    </assembly> 
    

    最終你會得到以下文件在您的安裝文件夾:

    yourexename.exe 
    yourexename.exe.config 
    somedll.dll 
    someassemblyname.manifest 
    

    和你的可執行文件將拿起DLL的私有副本。

    此處瞭解詳情:Application Configuration Files

    編輯:如果你有一個像問題「的應用程序未能正確初始化」或「並排配置方面是不正確」(你有他們,一旦你開始玩sxs),請使用sxstrace診斷工具(儘管在Windows XP上不可用)。這會告訴你確切的組裝會導致問題。

    +0

    其實你的回答爲我開啓了一個全新的方向和凝聚力謝謝你的新想法。但是還有一個問題,我的應用筆記只包含一個'exe',它也包含一些其他的DLL。這些DLL也使用相同的運行時程序集。所以當我更改'someassemblyname.manifest'文件版本。我似乎影響其他DLL。因爲程序顯示相同的錯誤。請協助 –

    +0

    應用程序顯示的錯誤是'應用程序未能正確初始化(0xc0150002)。點擊確定終止應用程序' –

    +0

    在這篇文章中的第一條評論我得到了我的DLL問題的答案。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa374182%28v=vs.85%29.aspx。 @Eugene:你是一個應該在微軟的人。 =) –

    相關問題