winsxs 的来龙去脉,解决msvcrt manifest 冲突.

winsxs 的来龙去脉看这里 http://www.davidlenihan.com/2007/07/winsxs.html

最近在解决一个vista上的msvcrt 无法加载导致 mozilla 无法初始化的bug . 原来是 llmozlib2 提供的几个lib 有把manifest 嵌入,所以那个 llmozlib_dll.dll 会去找 .762的 msvcrt  而我们的客户端是用.4053  编译的, 所以为了兼容放了一份在当前目录下, 而vista上找不到这个库而去转找 4016 ,是winsxs 里面的 policy 文件指定的. 一个程序貌似没有办法同时使用不同版本的 msvcr dll 结果后者就失败了.  然后客户端就不能显示web页面了.

解决办法: 把embed manifest 关闭, 然后编译. 这样可以看到输出的 manifest 文件里包含了如下

<?xml version=”1.0″ encoding=”UTF-8″ standalone=”yes”?>
<assembly xmlns=”urn:schemas-microsoft-com:asm.v1″ manifestVersion=”1.0″>
<dependency>
<dependentAssembly>
<assemblyIdentity type=”win32″ name=”Microsoft.VC80.CRT” version=”8.0.50727.762″ processorArchitecture=”x86″ publicKeyToken=”1fc8b3b9a1e18e3b”></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type=”win32″ name=”Microsoft.VC80.CRT” version=”8.0.50727.4053″ processorArchitecture=”x86″ publicKeyToken=”1fc8b3b9a1e18e3b”></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>

于是,我们只需要手动把762那个删掉. 就可以了.  :)  还有最关键一点就是把之前动态链接llmozlib2 改成了静态链接.

Read More