使用 C++ 应用程序加载 dll

Posted

技术标签:

【中文标题】使用 C++ 应用程序加载 dll【英文标题】:dll loading using C++ application 【发布时间】:2019-02-25 04:07:06 【问题描述】:

我的插件是在 c++ 中使用 Visual Studio。 我们的产品中有几个插件。我们的插件 exe 正在使用一个版本的 spotabcXXXX.dll,该版本位于我们存在 exe 的 bin 文件夹中,而另一个插件也使用位于不同位置的不同版本的 spotabcXXXX.dll。

当我们独立运行我们的插件时,它使用的是我们的 bin 中的 spotabcXXXX.dll。但是当我们运行整个产品时,我们的插件不是从我们的 bin 中引用 spotabcXXXX.dll,而是从不同的位置引用。 我们的产品架构:

C:\Spot
-->CommonFiles
   ----->spotabcXXXX.dll
-->OurPlugin
   ----->spotabcXXXX.dll

由于 CommonFiles 先出现(不知道是什么原因),我们的插件从 CommonFiles 中获取了 spotabcXXXX.dll。 我们没有以编程方式使用 LoadLibrary。

请帮助我如何从我们的 bin 中加载 dll。

【问题讨论】:

【参考方案1】:

您需要检查 DLL 搜索顺序以及它与您的“整个产品”及其位置的关系;请看:https://docs.microsoft.com/en-us/windows/desktop/dlls/dynamic-link-library-search-order

【讨论】:

【参考方案2】:

这正是Side-by-Side Assemblies 和Activation Contexts 可以用来解决的那种情况。

如果您的插件静态加载spotabcXXXX.dll,您可以为其定义一个SxS 清单,指定对您想要的spotabcXXXX.dll 特定版本的依赖。当您的插件被加载时,操作系统加载器将加载并绑定清单指定的依赖 DLL。

如果你的插件动态加载spotabcXXXX.dll,你可以根据你想要的spotabcXXXX.dll的具体版本创建一个激活上下文,然后你可以在调用LoadLibrary()之前激活这个上下文。

无论哪种方式,您的插件都将绑定到该版本的spotabcXXXX.dll,即使调用进程的其他部分想要使用不同版本的spotabcXXXX.dll

【讨论】:

以上是关于使用 C++ 应用程序加载 dll的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 和嵌入式单声道调用 C# DLL 时无法加载程序集系统

.NET Core 应用程序无法加载 C++ DLL

在 asp.net 中使用 c++ dll - 异常:无法加载文件或程序集

从 C++ 应用程序调试动态加载的 C++/CLI DLL

返回String类型时Visual Basic WPF加载ATL C++ dll程序退出

C# Windows 窗体无法在 Windows10 上加载非托管 C++ DLL