背景:
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
),“Name”( Microsoft.VC90.CRT
),“publicKeyToken”( 1fc8b3b9a1e18e3b
)和“Version” 9.0.30729.1
)的议会或政策。
问题:程序集( x-ww_6f74963e
)或策略( x-ww_b7353f75
)文件夹名称描述的最后部分是什么?
好的,这是最初的问题(但相当长的故事)。 我在Windows XP计算机中部署了我的C ++ MFC应用程序,该应用程序以前安装了一些C ++重新分发包和一些运行时程序集的安全修补程序。 因此,这些预先安装的C ++重新分发包会自动在Winsxs/policies
部署一些运行时Winsxs/policies
。 这些策略强制使用新的运行时程序集,而不是由我的应用程序使用和部署。 但有些时候,这些较新的DLL不在那里,因为一些其他的应用程序删除或程序集可能会损坏。 所以我find一种方法来部署特别用于我的应用程序的运行时程序集(这意味着我的应用程序必须使用曾经部署的程序并忽略策略)。 所以我认为子目录名的最后部分与应用程序的身份相关联。 我需要find它。
如果你不能信任全局缓存(在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的私人副本。
更多信息: 应用程序配置文件
编辑:如果你有像“应用程序未能正确初始化”或“并排配置不正确”(你将拥有它们,一旦你开始玩sxs)的问题,使用sxstrace工具进行诊断(Windows XP上不可用)。 这会告诉你究竟哪个组件会导致问题。