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

标签 c# winapi visual-c++ pinvoke

我正在研究一个解决方案,它的大部分核心引擎都是作为 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/

相关文章:

c# - 获取任务栏中所有窗口的句柄

delphi - 查询当前CPU的频率

c# - 如何创建不比较两个单独继承类的抽象基类 IComparable?

c++ - 如何使用线程同时下载和转换二进制文件?

c# - 将 CJK 字符粘贴到 RichTextBox 会添加不需要的第二种字体

c - 当我从 Julia 代码调用 midiOutOpen 时,它返回未知错误

visual-c++ - 如何使用霍夫变换将行存储保存在矩阵中?

visual-c++ - 无法从 'LRESULT (__clrcall....) to ' WNDPROC' 转换

c# - [事实] 属性是什么?

c# - 更新 Entity Framework 实体与其他实体的多种关系