背景
C:\windows\Winsxs
文件夹policies
和Manifests
Winsxs
和policies
内的所有子文件夹具有相同的命名格式。例如文件夹名称:
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
),“名称”(Microsoft.VC90.CRT
),“publicKeyToken”({ {1}})和汇编或政策的“版本”(1fc8b3b9a1e18e3b
)。
问题:
程序集名称描述的程序集(9.0.30729.1
)或策略(x-ww_6f74963e
)的最后一部分是什么?
好的,这是最初的问题(但很长的故事)。我在Windows XP计算机中部署了我的C ++ MFC应用程序,该计算机之前安装了一些C ++重新分发程序包和一些运行时程序集的安全补丁。因此,这些预安装的C ++重新分发软件包会自动在x-ww_b7353f75
中部署一些运行时策略。这些策略强制使用新的运行时程序集,而不是我的应用程序使用和部署的程序集。但有些时候由于某些其他应用程序删除或程序集而不存在这些较新的DLL可能会被破坏。所以我找到了一种方法来部署专门用于我的应用程序的运行时程序集(这意味着我的应用程序必须使用它一次部署并忽略策略)。所以我认为子目录名称的最后一部分与应用程序的标识相关联。我需要找到它。
答案 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,将拥有它们),请使用< strong> sxstrace 用于诊断的工具(不适用于Windows XP)。这将告诉你究竟哪个组件会导致问题。