可以在同一个应用程序中加载不同版本的DLL吗?

时间:2010-12-09 09:41:36

标签: c++ dll manifest dllimport

我的应用程序使用一个版本的库(a.dll),我正在使用另一个DLL(b.dll),后者又使用我使用的相同库(a.dll)的旧版本。我正在通过嵌入清单文件来构建应用程序。我使用的DLL也使用嵌入式清单文件。我在WinSXS文件夹中有两个版本的库。我的应用程序无法加载适当版本的DLL。

是否有单独的清单文件(不嵌入DLL)有助于解决问题?有什么工作?

2 个答案:

答案 0 :(得分:6)

您的情况正是WinSxS应该解决的情况。它应该工作。

:清单文件指向同一版本,或者其中一个清单文件没有正确嵌入,或者

WinSxS中的共享程序集安装了一个配置策略,该策略自动将v1.0的请求重定向到v1.1


需要一些说明:App.exe和b.dll是否与a.dll隐式链接?或者他们通过LoadLibrary加载它。

如果B.DLL使用LoadLibrary显式加载A.DLL,则需要将ISOLATION_AWARE_ENABLED添加到预处理器定义中,以确保B.DLL进行的LoadLibrary调用在正确的激活上下文中查找。否则,它们将在EXE清单创建的默认激活上下文的上下文中生成。

答案 1 :(得分:0)

这取决于重复的DLL的作用以及它们的版本是否兼容。 (例如,他们是否都访问内存中的共享对象?如果是这样,那么很有可能会爆炸。)

它还取决于如何加载这两个同名的DLL。如果它不是具有完整路径的显式LoadLibrary,那么事情可能不起作用。这里有一个持续的讨论:Determine the loaded path for DLLs

一般情况下,如果你很幸运,它可能会有用。如果可以的话,可能会出现灾难性错误的事实是完全避免这个问题的一个很好的理由。 (在最坏的情况下,您可以在另一个进程中托管其中一个模块并代理对它的所有调用。理想情况下,只需在两个模块中使用相同的DLL版本。)