Windows 7上的DLL重定向

时间:2013-11-11 18:09:38

标签: c++ windows dll windows-7

我正在尝试在Windows 7 x64计算机上执行DLL重定向。我有一个第三方应用程序App.exe,位于%PROGRAMFILES%\SomeApp\App.exe。 App.exe是一个本机非托管Windows应用程序,依赖于非托管本机DLL,例如foo.dll中存在的C:\Windows\System32

现在我拥有自己的foo.dll版本,我希望App.exe加载C:\Windows\System32而不是App.exe.manifest中存在的版本。

以下是我在XP上尝试并运行良好的内容:

  1. 创建清单文件foo.dll
  2. %PROGRAMFILES%\SomeApp内复制我的App.exe版本。这是<file name="foo.dll">所在的目录。
  3. 在清单文件中,指定DLL依赖项(特别是与MS VC运行时相关),还包括App.exe.config
  4. 启动该应用程序。
  5. 但是,这在Windows 7上不起作用。

    我搜索了一下,我的研究让我进入this MSDN讨论。这里的答案讨论了创建程序集以及提供配置文件(例如WinSxS)。 MSDN没有谈到这一点。因此我的第一个问题是:

    是否必须将我们的非托管DLL包装到上面链接中提到的程序集中,是否还要求有一个应用程序配置文件来进行DLL重定向?

    此外,我还提到了Windows 7中<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

    因此我的第二个问题是:

    属性sourceNamesourcePathimportPath<file>代表什么?这些未记录在Assembly ManifestApplication Manifest MSDN文档中。

    我的第三个问题(第一和第二个暗示):

    必须在App.exe.manifest中指定正确的{{1}}标记条目是什么,以便我的foo.dll版本被选中?

    欢迎在Windows 7上实现DLL重定向的任何其他指针。

1 个答案:

答案 0 :(得分:1)

尽可能避免DLL重定向。将所有DLL放在与EXE相同的文件夹中。这对于MSVC DLL本身来说是无法避免的。在安装程序中将redist作为依赖项安装通常会修复这些问题。