【发布时间】:2013-11-23 15:27:58
【问题描述】:
我正在尝试在 Windows 7 x64 机器上执行 DLL 重定向。我有一个位于%PROGRAMFILES%\SomeApp\App.exe 的第三方应用程序App.exe。 App.exe 是本机非托管 Windows 应用程序,依赖于非托管本机 DLL,例如 foo.dll,它存在于 C:\Windows\System32 中
现在我有自己的foo.dll 版本,我希望App.exe 加载而不是C:\Windows\System32 中存在的版本。
这是我在 XP 上尝试过并且运行良好的方法:
- 创建清单文件
App.exe.manifest - 在
%PROGRAMFILES%\SomeApp中复制我的foo.dll版本。这是App.exe所在的同一目录。 - 在清单文件中,指定 DLL 依赖项(尤其是与 MS VC 运行时相关的),还包括
<file name="foo.dll"> - 启动应用程序。
但是,这在 Windows 7 上不起作用。
我在 Google 上四处搜索,我的研究将我引向了 this MSDN 讨论。这里的答案是关于创建程序集并提供配置文件(例如App.exe.config)。 MSDN 没有谈论这个。因此我的第一个问题:
是否必须将我们的非托管 DLL 包装到上述链接中提到的程序集中,并且是否还必须有一个应用程序配置文件以进行 DLL 重定向?
此外,我还参考了 Windows 7 中 WinSxS 文件夹中存在的一些应用程序清单,并找到了一些包含 <file> 元素条目的清单文件,如下所示:
<file hash="6bd4c0b867d2ec23a03fc1b290abc62a7d7d0908"
hashalg="SHA1"
name="aspnet_regiis.exe"
destinationPath="$(runtime.windows)\Microsoft.NET\Framework64\v2.0.50727\"
sourceName="aspnet_regiis.exe"
sourcePath="Win\Microsoft.NET\Framework\URTInstallPath\"
importPath="$(build.nttree)\netfx\Win\Microsoft.NET\Framework\URTInstallPath\">
因此我的第二个问题:
destinationPath、sourceName、sourcePath 和 importPath 属性代表什么?这些没有记录在Assembly Manifest 或Application Manifest MSDN 文档中。
还有我的第三个问题(由第一个和第二个暗示):
必须在 App.exe.manifest 中指定正确的 <file> 标记条目是什么,才能获取我的 foo.dll 版本?
欢迎任何其他在 Windows 7 上实现 DLL 重定向的指针。
【问题讨论】: