如何使用DLL将C ++类库导出到C#?

时间:2013-11-12 01:01:37

标签: c++ c# import dll

在我之前的修订游戏引擎中,我驱逐了C#游戏编辑器的主要功能。现在,我开始用静态库修改游戏引擎。在C ++中创建了一个已经动态的库,可以将DLLEXPORT用于C#。刚才我想测试更新的函数并从C ++创建一个DLL文件。因为DLL包含类,我想知道如何使用DLL导出。我会这样做:

[DLLEXPORT("GameEngine.dll", EntryPoint="SomeClass", Conventional=_stdcall)]
static extern void functionFromClass();

我感觉它可能是DLLImport而不是DLLExport。我想知道我该怎么做?我想的另一种方式是因为我已经准备好了C ++中的DLL来进入C#类库。我可以将新引擎保留为lib,并将lib与旧的DLL C ++文件链接起来。

EntryPoint是否能够指向函数所在的类?

3 个答案:

答案 0 :(得分:2)

你不能像这样直接导出C ++类。

static extern void functionFromClass();

C ++的问题在于它没有普遍定义的ABI(应用程序二进制接口)。所以为了让其他语言理解你的C ++库ABI,你需要用C函数包装它(几乎所有其他语言都理解C)。

C的问题在于它不了解类。另一方面,C ++ Objects需要将this指针作为参数传递给它们的成员函数。所以为了用C接口包装你的C ++类。您需要显式处理传递this参数,并定义类似于构造函数和析构函数的函数。

你需要这样做:

//Header File Foo.h
    struct Foo; // Forward Declaration Only
    Foo*  createFoo( /* parameters */ );
    void  destroyFoo( Foo* obj );
    int Func( Foo* obj, int i ); // obj should take this pointer 
    float Func2( Foo* obj, float i, float j );

像这样实施

#include "Foo.h"
extern "C" 
{
  Foo* createFoo( const char * s )
  {
    return reinterpret_cast<Foo*>( new Foo( s ) );
  }
  void destroyFoo( Foo* obj )
  {
    delete reinterpret_cast<Foo*>(obj );
  }
  int Func( Foo* obj, int i )
  {
    return reinterpret_cast<Foo*>(obj)->Func(i);
  }
}

最后,您可以将导出的C函数包装在C#类中,这样就可以回到传统的面向对象的方式。

请注意,我甚至没有提到继承或多态。

答案 1 :(得分:1)

您无法直接将本机C ++类导入C#。他们需要以这种或那种方式包裹。您可以使用C样式的非成员函数来包装它们。您需要导出创建和销毁实例的函数。总而言之,这是一个非常可怕的过程。

执行此操作的明智方法是将本机C ++代码编译为混合模式C ++ / CLI程序集。然后,您可以将该功能公开为托管引用类。互操作然后变得微不足道,你不需要手动编写p / invoke声明的手套。

答案 2 :(得分:1)

我建议看看COM对象并使用COM Interop在Cpp和C#程序之间进行通信。