如何从C ++ DLL动态加载C#dll

时间:2011-06-01 20:41:06

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

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

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

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

在我加载库之后,遗憾的是我怀疑COM是将来作为调用派生函数的方法。可能我可以使用我一直在阅读的CLI / C ++包装器,但我在这里非常缺乏经验,并希望得到任何建议或指向相应文章的链接。

3 个答案:

答案 0 :(得分:2)

你要做的是基本上在你的过程中启动CLR的一个实例。 请查看CLR hosting

上的这篇文章

答案 1 :(得分:2)

另一种方法是创建一个承载C#类的C ++ / CLI项目,并将其用作C ++项目中的桥梁。

此方法的更多链接:

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

答案 2 :(得分:0)

以下是一些描述我的解决方案的幻灯片。

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 ++中的基类。