如何在Win32 C ++项目中使用C#dll?

我正在研究一个解决方案,它的大部分核心引擎都是作为Win32 C ++开发的(并且与平台无关,也用于OS X),前段时间我们需要从C#调用C ++ dll的核心引擎,我能够在C#中加载主解决方案的DLL(在SO的某些线程的帮助下)。 但是现在我们在Managed C#dll中实现了某些东西,需要在Win32 C ++项目中使用它吗? (只提供函数定义和DLL)

您可以创建托管C ++互操作DLL,以充当C#库的包装器。

不幸的是,大多数关于托管C ++的教程只解释了如何包装非托管C ++以便在C#中使用。 但它也可以用另一种方式工作。

在本机C ++代码中定义抽象接口类,然后在托管C ++ DLL中创建一个具体的子类。 在方法实现中调用C#对象。

最后,导出一个工厂函数,该函数将实例化实现类并返回本机代码可以使用的基类指针。

这是一个简单的例子:

首先,在本机DLL中定义类接口。

interopclassbase.h

class InteropClassBase { public: virtual void doStuff() = 0; virtual int getValue() = 0; virtual void getString(CString* outStr) = 0; }; 

现在,您需要创建一个C ++ / CLI DLL,它允许您在单个程序集中混合本机代码和托管代码。 将新的C ++项目添加到您的解决方案中,并在项目配置中将“公共语言运行时支持”选项设置为“ 混合” (/ clr)。

一旦你添加了对C#库(我们称之为ManagedLibrary)的引用,我们就可以实现interop类:

interopclass.cpp

 #include "interopclassbase.h" #include  public class InteropClass : public InteropClassBase { protected: gcroot m_managedObject; public: InteropClass() { m_managedObject = gcnew ManagedLibrary::ManagedObject(); } virtual void doStuff() { m_managedObject->doStuff(); } virtual int getValue() { return m_managedObject->getValue(); } virtual void getString(CString* pOutStr) { System::String^ managedString = m_managedObject->getString(); CString nativeString(managedString); // overloaded CString constructor if (pOutStr) *pOutStr = nativeString; } }; __declspec(dllexport) InteropClassBase* getImplementationPointer() { return new InteropClass(); } 

现在,您只需从本机项目加载互操作DLL并调用导出的函数。

一个解决方案是COM Interop。 可能是唯一的解决方案。 这是一个很大的话题。 在我使用的工作中有一本很大的蓝皮书。 COM Interop数以百计的其他内容。

简短版本是您在托管端标记了一些类和接口,并且创建了看起来像COM dll的互操作程序集,但它们实际上是托管程序集的代理。 互操作程序集就像COM dll一样注册,然后关闭。

MSDN有很多关于它的信息。

这可能是一个很好的起点。 “将.NET Framework组件暴露给COM” http://msdn.microsoft.com/en-us/library/aa720072%28VS.71%29.aspx

可以非常简单,但要尽量保持简单。

要创建托管对象并在其上调用方法,您需要在C ++进程中运行CLR。

在Windows下,您可以通过引用mscoree.dll并托管CLR来托管CLR。

http://msdn.microsoft.com/en-us/magazine/cc163567.aspx
http://msdn.microsoft.com/en-us/library/ms230997.aspx

对于Mono,您可以在C ++应用程序中嵌入Mono运行时。

http://www.mono-project.com/Embedding_Mono