C++ 如何导出C++;类库到C#使用dll?

C++ 如何导出C++;类库到C#使用dll?,c++,c#,import,dll,C++,C#,Import,Dll,在我上一次修订的游戏引擎中,我删除了C#游戏编辑器的主要功能。现在,我开始用一个静态库修改游戏引擎。在C++中已经创建了一个已经动态的库来使用C语言的DLL导出。现在我想测试新的函数,并从C++创建一个DLL文件。因为DLL包含类,我想知道如何使用DLL导出。我会这样做吗: [DLLEXPORT("GameEngine.dll", EntryPoint="SomeClass", Conventional=_stdcall)] static extern void functionFromClas

在我上一次修订的游戏引擎中,我删除了C#游戏编辑器的主要功能。现在,我开始用一个静态库修改游戏引擎。在C++中已经创建了一个已经动态的库来使用C语言的DLL导出。现在我想测试新的函数,并从C++创建一个DLL文件。因为DLL包含类,我想知道如何使用DLL导出。我会这样做吗:

[DLLEXPORT("GameEngine.dll", EntryPoint="SomeClass", Conventional=_stdcall)]
static extern void functionFromClass();
我感觉可能是DLLImport而不是DLLExport。我想知道我该怎么做?另一种方式是我已经在C++中已经准备好了DLL,去了C类库。我可以把新引擎作为一个LIB,并将LIB链接到旧的DLL C++文件。p>
入口点不能指向函数所在的类吗

< P>你不能像这样直接输出C++类。

static extern void functionFromClass();
< C++的问题是它没有一个通用定义的ABI(应用二进制接口)。因此,为了让其他语言理解C++库ABI,需要用C函数来封装它(几乎所有其他语言都理解C)。 C的问题是它不理解类。另一方面,C++对象需要将< <代码> >指针>作为成员函数的参数。因此,为了用C接口包装C++类。您需要显式地处理传递
这个
参数,还需要定义类似于构造函数和析构函数的函数

你需要这样做:

//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);
  }
}
#包括“Foo.h”
外部“C”
{
Foo*createFoo(const char*s)
{
返回重新解释(新Foo);
}
无效销毁Foo(Foo*obj)
{
删除重新解释(obj);
}
int Func(Foo*obj,int i)
{
返回reinterpret_cast(obj)->Func(i);
}
}
最后,您可以将导出的C函数封装在一个C#类中,以便回到传统的面向对象方式


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

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


<> P>智能方法是将本地C++代码包打包成混合模式的C++/CLI程序集。然后可以将该功能公开为托管ref类。互操作然后变得琐碎,不需要运行手工编写P/Unjk声明的操作。

< P>我建议看COM对象,并使用COM互操作在CPP和C++程序之间通信。只需将托管代码包在托管CLI C++中,然后转到C?这将使地狱的事情变得更容易,而且,也不会一直是一个麻烦的关键时刻。一旦你开始想要包装C++类,那么你就不能用纯C边的p/javk来完成。你需要写一些C++代码。只要您需要这样做,C++/CLI始终是最简单的解决方案。如果您希望包装以供.net以外的用户使用,则COM将是一个候选,但如果不是,则C++/CLI将获胜。我最喜欢您的答案,因为前一个引擎开始时使用混合的本机和CLI代码包装核心游戏引擎。我知道对于DLL来说,这将是一个非常长的H文件,但我现在只想坚持使用它,然后选择最适合在游戏端实现的函数。当我创建单独的头文件时,我不知道为什么C++的模糊性,但我会在我的过程中找出答案。但是谢谢大家的参与和帮助!