Windows 7上的DLL重定向

Pra*_*nde 5 c++ windows dll windows-7

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

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

这是我在XP上尝试并能正常使用的方法:

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

但是,这在Windows 7上不起作用。

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

是否必须按照上述链接将非托管DLL包装到程序集中,是否还必须具有用于DLL重定向的应用程序配置文件?

此外,我还提到WinSxS了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\">
Run Code Online (Sandbox Code Playgroud)

因此,我的第二个问题是:

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

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

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

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

Jos*_*hua 2

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