首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在c#代码中使用c++ dll中定义的类

在c#代码中使用c++ dll中定义的类
EN

Stack Overflow用户
提问于 2008-11-24 18:49:26
回答 6查看 106.1K关注 0票数 75

我有一个用c++写的动态链接库,我需要在我的c#代码中使用这个动态链接库。在搜索之后,我发现使用P/Invoke可以访问我需要的函数,但是这些函数是在一个类中使用定义的,并且使用非静态的私有成员变量。所以我需要能够创建这个类的一个实例来正确地使用这些函数。怎样才能访问这个类,以便创建一个实例?我一直无法找到一种方法来做到这一点。

我想我应该注意到,c++ dll不是我的代码。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-11-24 18:54:55

在C#代码中无法直接使用C++类。您可以以间接方式使用PInvoke来访问您的类型。

基本模式是,对于类Foo中的每个成员函数,创建一个关联的非成员函数,该函数调用成员函数。

代码语言:javascript
复制
class Foo {
public:
  int Bar();
};
extern "C" Foo* Foo_Create() { return new Foo(); }
extern "C" int Foo_Bar(Foo* pFoo) { return pFoo->Bar(); }
extern "C" void Foo_Delete(Foo* pFoo) { delete pFoo; }

现在是将这些方法PInvoking到C#代码中的问题了

代码语言:javascript
复制
[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);

缺点是您需要传递一个笨拙的IntPtr,但是围绕这个指针创建一个C#包装类来创建一个更有用的模型是一件比较简单的事情。

即使您不拥有这段代码,您也可以创建另一个DLL来包装原始DLL并提供一个小的PInvoke层。

票数 96
EN

Stack Overflow用户

发布于 2016-04-12 20:59:49

封送C++类并使用PInvoke

C++代码,类名.h

代码语言:javascript
复制
class __declspec(dllexport) CClassName
{
 public:
    CClassName();
    ~CClassName();
    void function();

};

C++代码,ClassName.cpp

代码语言:javascript
复制
CClassName::CClassName()
{
}

CClassName::~CClassName()
{
}

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

}

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

代码语言:javascript
复制
#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文件

代码语言:javascript
复制
#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#代码

代码语言:javascript
复制
[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; 
票数 33
EN

Stack Overflow用户

发布于 2008-11-24 19:05:54

Here是一个如何从VB调用C++类方法的示例-对于C#,您只需在步骤4中重写示例程序。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/315051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档