【问题标题】:How to dynamically load a C# dll from a C++ DLL如何从 C++ DLL 动态加载 C# dll
【发布时间】:2011-09-06 15:14:52
【问题描述】:

我有一个 C++ 应用程序。这支持用户的 C++ 插件 DLL,它将动态加载这些 DLL,然后能够动态创建和使用用户的类型。这些用户类型派生自主应用程序核心库中定义的基类型和接口,因此我将用户对象作为指向基类的指针,并调用用户的虚函数来实现它们的魔力。

现在我想扩展插件 DLL 以允许托管 DLL(我主要关心 C#)。我希望所有相同的魔法都发生在 C# 插件 DLL 中。

我如何动态加载这些 dll,我认为我目前使用的 win32 的 LoadLibrary 对托管 DLL 会很满意。我在编译/链接时无法访问这些库,它们来自用户。

在我加载库之后,不幸的是,我怀疑 COM 将来会作为调用派生函数的方式。可能我可以使用我一直在阅读的 CLI/C++ 包装器,但我在这里非常缺乏经验,如果有任何建议或相关文章的链接,我将不胜感激。

【问题讨论】:

    标签: c# c++ interop virtual-functions dynamic-loading


    【解决方案1】:

    您要做的基本上是在您的进程中启动一个 CLR 实例。 看看这篇文章CLR hosting

    【讨论】:

    • 链接已断开。
    【解决方案2】:

    这里有一些幻灯片描述了我的解决方案。

    https://docs.google.com/presentation/pub?id=1YoJRGnveh4By7ym4GL19L7OzYOFORZQB6RgJEPVfFb8&start=false&loop=false&delayms=3000

    我的解决方案是有一个 win32 插件 dll,通过正常方式 (LoadLibrary) 加载,链接到混合 C++/CLI dll,后者链接到纯托管 C# 代码。我允许使用 A LOT 样板和基于 Padu 给出的链接的双 c++/cli 桥接模式以两种方式进行调用。细节相当复杂,但最终 API 用户的工作非常简单,这就是我的目标。托管插件对象编写器只是从一个对象派生而来,一切正常。

    基本上我创建了一个提供“混合模式伪继承”的模式现在我的 c# 对象派生自 c++ 中的基类。

    【讨论】:

      【解决方案3】:

      另一种方法是创建一个 C++/CLI 项目来托管您的 C# 类并将其用作 C++ 项目中的桥梁。

      此方法的更多链接:

      最新链接有桥的简单源代码

      【讨论】:

      • 我是否还需要在非托管进程中启动 CLR(根据上面 Al3891 响应中的链接)来加载此 Bridge DLL?
      • 并非如此。请参阅我帖子中的第二个链接
      猜你喜欢
      • 2010-09-30
      • 1970-01-01
      • 2019-05-31
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      相关资源
      最近更新 更多