怎样在c#代码中使用c++dll中定义的类?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (1)
  • 查看 (779)

我有一个用c++编写的DLL,我需要在我的c#代码中使用这个DLL。搜索之后,我发现使用P/Invoke可以让我访问我需要的函数,但是这些函数是在类中定义的,并且使用非静态私有成员变量。因此,我需要能够创建这个类的一个实例来正确地使用这些函数。如何获得对该类的访问权限,以便创建实例?

提问于
用户回答回答于

对于foo类中的每个成员函数,创建一个关联的非成员函数,该函数调用成员函数。

class Foo {
public:
  int Bar();
};
Foo* Foo_Create() { return new Foo(); }
int Foo_Bar(Foo* pFoo) { return pFoo->Bar(); }
void Foo_Delete(Foo* pFoo) { delete pFoo; }

现在问题是将这些方法引入到C#代码中

[DllImport("Foo.dll")]
public static extern IntPtr Foo_Create();

[DllImport("Foo.dll")]
public static extern int Foo_Bar(IntPtr value);

[DllImport("Foo.dll")]
public static extern void Foo_Delete(IntPtr value);
用户回答回答于

C++代码,ClassName.h

class __declspec(dllimport) CClassName
{
 public:
    CClassName();
    ~CClassName();
    void function();

};

C++代码,ClassName.cpp

CClassName::CClassName()
{
}

CClassName::~CClassName()
{
}

void CClassName::function()
{
    std::cout << "Bla bla bla" << std::endl;

}

C++代码,调用函数的ClassNameCaller.h文件

#include "ClassName.h"      

#ifdef __cplusplus
extern "C" {
#endif

extern __declspec(dllexport) CClassName* CreateClassName();

extern __declspec(dllexport) void DisposeClassName(CClassName* a_pObject);

extern __declspec(dllexport) void function(CClassName* a_pObject);


#ifdef __cplusplus
}
#endif

C++代码,调用函数的ClassNameCaller.cpp文件

#include "ClassNameCaller.h"


CClassName* CreateClassName()
{
    return new CClassName();
}

void DisposeClassName(CClassName* a_pObject)
{
    if(a_pObject!= NULL)
    {
        delete a_pObject;
        a_pObject= NULL;
    }
}

void function(CClassName* a_pObject)
{
    if(a_pObject!= NULL)
    {
        a_pObject->function();
    }
}

C#代码

[DllImport("ClassNameDll.dll")]
static public extern IntPtr CreateClassName();

[DllImport("ClassNameDll.dll")]
static public extern void DisposeClassName(IntPtr pClassNameObject);

[DllImport("ClassNameDll.dll")]
static public extern void CallFunction(IntPtr pClassNameObject);

//use the functions
IntPtr pClassName = CreateClassName();

CallFunction(pClassName);

DisposeClassName(pClassName);

pClassName = IntPtr.Zero; 

扫码关注云+社区

领取腾讯云代金券