4

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

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

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

EntryPoint 不能指向函数所在的类吗?

4

3 回答 3

3

您实际上不能像这样直接导出 C++ 类。

static extern void functionFromClass();

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

C 的问题在于它不理解类。另一方面,C++ 对象需要将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# 类中,以便回到传统的面向对象方式。

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

于 2013-11-12T05:31:31.803 回答
2

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

于 2013-11-12T17:01:14.440 回答
2

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

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

于 2013-11-12T17:00:13.047 回答