使用 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 时无法加载程序集系统
在 asp.net 中使用 c++ dll - 异常:无法加载文件或程序集