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

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

Patricia Arquette
Patricia Arquette原创
2024-12-28 21:49:11167浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn