如何使用WinSxS清单重定向到旧版本的DLL?

时间:2011-02-14 05:38:03

标签: windows dll binding manifest winsxs

假设我有一个使用MSHTML的应用程序。安装IE9 beta会更新MSHTML,这会破坏我的应用程序。我发现IE8 DLL的副本仍然存在于WinSxS文件夹中,所以也许我可以以某种方式使用它们而无需重新编译我的程序? WinSxS能做到吗?

我已经搜索了很长时间,但无法弄清楚如何重定向加载程序以使用IE8 MSHTML(在WinSXS中)而不是IE9(在%SYSTEMROOT%\ system32中)。任何想法/例子将不胜感激。

2 个答案:

答案 0 :(得分:1)

我已经采用了不同的方法解决这个问题。我将分享我最终做的事情 - 我劫持LoadLibrary并加载我想要的任何DLL:DLL file loaded twice with DLL redirection through manifest

要回答问题的具体标题(“使用WinSxS清单重定向”),我会根据与WinSxS的长时间战斗来回答“不,你不能”如果你不同意,我会很高兴看到如何做到这一点。)

答案 1 :(得分:1)

您绝对不能使用WinSxS清单或策略重定向来强制加载不同版本的OS组件。虽然os组件也存储在WinSxS存储中,但它们不能作为sxs程序集绑定,因此不可能进行这种重定向。

重新定位LoadLibrary并强制加载旧版本的mshtml(或任何其他操作系统DLL)是一个非常糟糕的主意,我强烈建议不要这样做。原因包括以下事实:旧的DLL可能不会出现在所有安装中,您不太可能正确挂钩所有加载路径(因此创建一个奇怪的混合),当然像MSHTML这样的东西设计用于特定的方式和任何其他用途可能会导致以后出现问题 - 尤其是在像HTML这样的安全敏感内容中。

马丁