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

C++ 不同版本的DLL可以加载到同一个应用程序中吗?,c++,dll,manifest,dllimport,C++,Dll,Manifest,Dllimport,我的应用程序使用一个版本的库(a.dll),我正在使用另一个dll(b.dll),它反过来使用我使用的同一个库(a.dll)的旧版本。我通过嵌入清单文件来构建应用程序。我使用的DLL也使用嵌入的清单文件。我的WinSXS文件夹中有两个版本的库。我的应用程序无法加载适当版本的DLL 拥有一个单独的清单文件(不嵌入DLL)是否有助于解决问题?你的工作是什么 您的情况正是WinSxS应该解决的情况。它应该是有效的 或者:清单文件指向同一版本,或者其中一个清单文件未正确嵌入,或者 WinSxS中的共享程

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


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

您的情况正是WinSxS应该解决的情况。它应该是有效的

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

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


需要澄清的是:App.exe和b.dll是否与a.dll隐式链接?或者他们通过LoadLibrary加载它


如果B.DLL使用LoadLibrary显式加载A.DLL,则需要在预处理器定义中添加隔离\u-AWARE\u-ENABLED,以确保B.DLL进行的LoadLibrary调用位于正确的激活上下文中。否则,它们将在由EXE清单创建的默认激活上下文的上下文中创建。

这将取决于复制的DLL的功能以及它们的版本是否兼容。(例如,它们是否都访问内存中的共享对象?如果是,则很有可能发生爆炸。)

它还将取决于如何加载这两个同名DLL。如果它不是一个具有完整路径的显式LoadLibrary,那么事情可能就不起作用了。这里正在讨论这一点:


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

使用Dependency Walker的分析功能,查看您的应用程序尝试加载的DLL。这可能已经指出了问题的原因。我不确定WinSxS在这方面是否有帮助。WinSxS允许您为exe提供清单,以确保进程加载特定版本的DLL。这里的问题是同一进程中的不同模块需要同一DLL的不同版本。AFAIK WinSxS没有提供解决方案,尽管我不是WinSxS方面的专家,可能是错的。嗯?App.exe使用清单引用sharedassembly.1.1\a.dll,并加载b.dll,其中还包含引用sharedassembly.1.0\a.dll的清单-这是“应用程序隔离”设计为支持的100%方案。这听起来像是“模块隔离”而不是“应用程序隔离”,但可能我错了。我快速查看文档给我的印象是WinSxS让AppX.exe加载1.1\a.dll和AppB.exe加载1.0\a.dll,但没有一个应用加载同一dll的多个版本(这似乎是一个灾难的普遍原因,尽管它可以与某些dll一起工作)。@天哪,我可能错了。虽然文档还很不明确,但我发现这似乎支持了您的说法:--我的回答是+1。我还将在另一个问题中提到它,以防它在那里使用。这项技术在一些地方完全命名错误。应用程序隔离实际上意味着模块隔离,因为应用程序已经可以加载同一dll的不同版本。“应用程序隔离”和“应用程序清单文件”允许dll通过将进程划分为“激活上下文”来声明对同一(命名)dll的依赖关系并加载不同版本的dll。