我正在尝试在 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 上尝试过并且运行良好的方法:
- 创建清单文件
App.exe.manifest
- 复制我的 inside
foo.dll
版本%PROGRAMFILES%\SomeApp
。这是App.exe
驻留的同一目录。 - 在清单文件中,指定 DLL 依赖项(尤其是与 MS VC 运行时相关的),还包括
<file name="foo.dll">
- 启动应用程序。
但是,这不适用于 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\">
因此我的第二个问题:
属性destinationPath
,sourceName
和代表什么sourcePath
?importPath
这些没有记录在程序集清单或应用程序清单MSDN 文档中。
我的第三个问题(由第一个和第二个暗示):
必须在 App.exe.manifest 中指定的正确<file>
标记条目是什么,以便获取我的 foo.dll 版本?
欢迎任何其他在 Windows 7 上实现 DLL 重定向的指针。