2011-06-01 116 views
6

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

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

我该如何动态加载这些dll的,一些我认为我目前使用的win32的LoadLibrary会满足于一个托管的DLL。我不会在编译/链接时访问这些库,它们来自用户。

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

回答

2

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

一些更多的链接,这种做法:

最新的链接已为桥梁

+0

我是否还需要在非托管进程中启动CLR(按照上面Al3891的响应中的链接)来加载此Bridge DLL? – AlwaysTraining 2011-06-01 21:34:07

+0

不是。查看我帖子中的第二个链接 – 2011-06-01 22:55:06

2

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

+1

很好的参考(+1) – Mike 2011-06-01 20:59:36

+0

链接现在被打破。 – tMJ 2016-05-12 20:39:46

0

这里简单的源代码是一些幻灯片来描述我的解。

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

我的解决办法是有一个Win32 DLL插件,通过链接到混合的C++/CLI DLL,其链接到纯托管的C#代码正常装置(的LoadLibrary)加载。我允许使用大量锅炉板进行调用,以及基于Padu给出的链接的双C++/cli桥接模式。细节相当复杂,但最终API用户的工作非常简单,这就是我的目标。受管理的插件对象编写器只是从一个对象派生而来,并且一切正常。

本质上我做了一个模式,提供“混合模式伪继承”现在我的c#对象从C++中的基类派生。