首页 > 后端开发 > C++ > 如何从 C# 访问具有成员变量和非静态方法的 C DLL 类?

如何从 C# 访问具有成员变量和非静态方法的 C DLL 类?

Patricia Arquette
发布: 2024-12-28 21:49:11
原创
148 人浏览过

How Can I Access a C   DLL Class with Member Variables and Non-Static Methods from C#?

在 C# 代码中访问 C DLL 类

问题:

使用 P/Invoke 访问 C 中的函数具有成员变量和非静态方法的 DLL 需要创建定义类的实例。如何访问该类?

答案:

在 C# 中直接使用 C 类是不可能的。相反,请按照以下步骤操作:

  1. 为每个类成员函数创建非成员函数,调用成员函数。
  2. 使用 P/Invoke 将这些非成员函数公开给C#.

示例:

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; }
登录后复制

在 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);
登录后复制

包装类:

为了简化使用,将 IntPtr 指针包装成C# 包装类:

public class FooWrapper
{
  private IntPtr _foo;

  public FooWrapper()
  {
    _foo = Foo_Create();
  }

  public int Bar()
  {
    return Foo_Bar(_foo);
  }

  public void Dispose()
  {
    Foo_Delete(_foo);
  }
}
登录后复制

替代方法:

如果无法修改原始 DLL,请创建一个中间 DLL 来包装原始 DLL 并公开包装后的 DLL C# 类。

以上是如何从 C# 访问具有成员变量和非静态方法的 C DLL 类?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板