我正在尝试在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上尝试并运行良好的内容:
foo.dll
%PROGRAMFILES%\SomeApp
内复制我的App.exe
版本。这是<file name="foo.dll">
所在的目录。App.exe.config
但是,这在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
因此我的第二个问题是:
属性sourceName
,sourcePath
,importPath
和<file>
代表什么?这些未记录在Assembly Manifest或Application Manifest MSDN文档中。
我的第三个问题(第一和第二个暗示):
必须在App.exe.manifest中指定正确的{{1}}标记条目是什么,以便我的foo.dll版本被选中?
欢迎在Windows 7上实现DLL重定向的任何其他指针。
答案 0 :(得分:1)
尽可能避免DLL重定向。将所有DLL放在与EXE相同的文件夹中。这对于MSVC DLL本身来说是无法避免的。在安装程序中将redist作为依赖项安装通常会修复这些问题。