2

背景:

  • 位于C:\windows\Winsxs文件夹中的 Windows 共享运行时库
  • 在 Winsxs 中,有两个重要的子文件夹也位于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) 和“Version”( 9.0.30729.1)。

问题:x-ww_6f74963e assembly( ) 或 policy( x-ww_b7353f75) 文件夹名称 的最后一部分描述了什么?


好的,这是最初的问题(但故事很长)。我在 Windows XP 计算机上部署了我的 C++ MFC 应用程序,该计算机以前安装了一些 C++ 重新分发包和一些运行时程序集的安全补丁。所以这些预装的 C++ 再分发包会自动在Winsxs/policies. 这些策略强制使用新的运行时程序集,而不是我的应用程序使用和部署的程序集。但有时这些较新的 DLL 不存在,因为某些其他应用程序删除或程序集可能已损坏。所以我正在寻找一种方法来部署专门用于我的应用程序的运行时程序集(这意味着我的应用程序必须使用它曾经部署的程序并忽略策略)。所以我认为子目录名称的最后一部分与应用程序的身份相关联。我需要找到它。

4

1 回答 1

4

如果您不能信任全局缓存(在 WinXP 上非常容易损坏它),您可能必须安装程序集的私有副本并在应用程序配置中覆盖它们。

这是我用来覆盖一些程序集以进行调试的 hack:

在您的 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 的私有副本。

更多信息:应用程序配置文件

编辑:如果您遇到诸如“应用程序未能正确初始化”或“并排配置不正确”之类的问题(一旦您开始使用 sxs,您将拥有它们),请使用sxstrace工具进行诊断(尽管在 Windows XP 上不可用)。这将准确地告诉您哪个组件会导致问题。

于 2013-04-12T23:19:24.463 回答