5

我正在尝试在 Windows 7 x64 机器上执行 DLL 重定向。我有一个 3rd 方应用程序说它App.exe位于%PROGRAMFILES%\SomeApp\App.exe. App.exe 是本机非托管 Windows 应用程序,并且依赖于非托管本机 DLL,比如foo.dll存在于C:\Windows\System32

现在我有了自己foo.dll想要App.exe加载的版本,而不是C:\Windows\System32.

这是我在 XP 上尝试过并且运行良好的方法:

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

但是,这不适用于 Windows 7。

我四处搜索,我的研究将我引向了这个MSDN 讨论。这里的答案是关于创建程序集并提供配置文件(例如App.exe.config)。MSDN 没有谈论这个。因此我的第一个问题:

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

此外,我参考了WinSxSWindows 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,sourceName和代表什么sourcePathimportPath这些没有记录在程序集清单应用程序清单MSDN 文档中。

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

必须在 App.exe.manifest 中指定的正确<file>标记条目是什么,以便获取我的 foo.dll 版本?

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

4

1 回答 1

1

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

于 2013-11-11T18:19:33.007 回答