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

7
我有一个C++应用程序,支持用户的C++插件DLL。它会动态加载这些DLL,并能够动态创建和使用用户类型。这些用户类型派生自主应用程序核心库中定义的基础类型和接口,因此我将用户对象保持为指向基类的指针,并调用用户虚拟函数来实现其魔法。
现在我想扩展插件DLL以允许托管DLL(我主要关心C#)。我希望所有相同的魔法都发生在C#插件DLL中。
如何动态加载这些dll呢?我目前正在使用的win32的LoadLibrary可能不会对托管DLL感到满意。我在编译/链接时将无法访问这些库,它们来自用户。
在我加载库之后,不幸的是我认为我将来会涉及到COM来调用派生函数。也许我可以使用我一直在阅读的CLI / C++包装器,但我在这方面非常没有经验,希望得到任何建议或适当文章的链接。
3个回答

2
你需要做的就是在进程中启动CLR实例。请参考这篇关于CLR托管的文章。

链接现在已经失效。 - tmj

2

我是否仍需要在非托管进程中启动CLR(如Al3891上面的链接所述)来加载此Bridge DLL? - AlwaysTraining
不是真的。请查看我帖子中的第二个链接。 - Padu Merloti

0

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

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

我的解决方案是使用一个win32插件dll,通过正常方式(LoadLibrary)加载,该插件链接到混合的C++/CLI dll,后者链接到纯托管的C#代码。我使用了大量的样板代码和基于Padu提供的链接的双重c++/cli桥接模式,允许双向调用。细节相当复杂,但最终API用户的工作非常简单,这是我的目标。托管插件对象编写器只需从一个对象派生,一切都可以正常工作。
本质上,我创建了一种提供“混合模式伪继承”的模式。现在我的C#对象派生自C++中的一个基类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接