我正在研究一个解决方案,它的大部分核心引擎都是作为 Win32 C++ 开发的(并且是独立于平台的,也在 OS X 上使用),前段时间我们需要从 C# 调用核心引擎的 C++ dll,我能够在 C# 中加载主要解决方案的 DLL(在 SO 上的一些线程的帮助下)。但是现在我们在 Managed C# dll 中实现了某些东西并且需要在 Win32 C++ 项目中使用它? (并且只提供函数定义和dll)
最佳答案
您可以创建一个托管 C++ 互操作 DLL 来充当 C# 库的包装器。
不幸的是,大多数关于托管 C++ 的教程只解释了如何包装非托管 C++ 以便在 C# 中使用。但反之亦然。
在您的 native C++ 代码中定义一个抽象接口(interface)类,然后在托管 C++ DLL 中创建一个具体的子类。在方法实现中调用 C# 对象。
最后,导出一个工厂函数,它将实例化实现类并返回一个您的 native 代码可以使用的基类指针。
这是一个简单的例子:
首先,在您的 native DLL 中定义类接口(interface)。
interopclassbase.h
class InteropClassBase
{
public:
virtual void doStuff() = 0;
virtual int getValue() = 0;
virtual void getString(CString* outStr) = 0;
};
现在您需要创建一个 C++/CLI DLL,它允许您在单个程序集中混合 native 代码和托管代码。将一个新的 C++ 项目添加到您的解决方案中,并在项目配置中设置 "Common Language Runtime Support" 混合 (/clr) 选项。
一旦您添加了对 C# 库(我们称之为 ManagedLibrary)的引用,我们就可以实现互操作类:
互操作类.cpp
#include "interopclassbase.h"
#include <vcclr.h>
public class InteropClass : public InteropClassBase
{
protected:
gcroot<ManagedLibrary::ManagedObject^> 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();
}
现在您只需从您的 native 项目加载互操作 DLL 并调用导出的函数。
关于c# - 我如何在 Win32 C++ 项目中使用 C# dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2446404/