【问题标题】:DLL Redirection on Windows 7Windows 7 上的 DLL 重定向
【发布时间】: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 上尝试过并且运行良好的方法:

  1. 创建清单文件App.exe.manifest
  2. %PROGRAMFILES%\SomeApp 中复制我的foo.dll 版本。这是 App.exe 所在的同一目录。
  3. 在清单文件中,指定 DLL 依赖项(尤其是与 MS VC 运行时相关的),还包括 <file name="foo.dll">
  4. 启动应用程序。

但是,这在 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\">

因此我的第二个问题:

destinationPathsourceNamesourcePathimportPath 属性代表什么?这些没有记录在Assembly ManifestApplication Manifest MSDN 文档中。

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

必须在 App.exe.manifest 中指定正确的 &lt;file&gt; 标记条目是什么,才能获取我的 foo.dll 版本?

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

【问题讨论】:

    标签: c++ windows dll windows-7


    【解决方案1】:

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

    【讨论】:

    • 我同意您的评论,但是正如我在问题中所说,这是一个第三方应用程序,它在 System32 中安装它的 DLL。然而,我们希望加载我们的特定 DLL 版本。因此,在这种情况下,DLL 重定向似乎是唯一的办法
    • 这很好用,总是先搜索本地目录。
    • 有人告诉我,在调用他们的 DLL 上的 LoadLibrary 之前调用你的 DLL 上的 LoadLibrary 是可行的,但我无法验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多