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

标签 c# c++ dll pinvoke

我有一个用 c++ 编写的 dll,我需要在我的 c# 代码中使用这个 dll。经过搜索,我发现使用 P/Invoke 可以让我访问我需要的函数,但是这些函数是在一个类中定义的,并且使用非静态私有(private)成员变量。所以我需要能够创建这个类的一个实例来正确使用这些函数。如何获得对此类的访问权限以便创建实例?我一直无法找到一种方法来做到这一点。

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

最佳答案

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

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

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# 代码中

[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 包装原始 DLL 并提供一个小的 PInvoke 层。

关于c# - 在 c# 代码中使用在 c++ dll 中定义的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/315051/

相关文章:

c# - 将 PartialView 内容作为电子邮件发送

c# - 将 Lucene 索引文件存储到远程位置

c# - 在 switch 语句中的默认情况下抛出 NotImplementedException

c++ - SFML - 粒子系统 vector 超出范围

c# - 在加载应用程序目录之外的目录中加载依赖于其他程序集的程序集?

c# - 可以在 CRM 之外生成实体 ID 吗?

c++ - 我是否遗漏了 Evil Hangman 的构造函数?

c++ - Qt 调试器中的 reinterpret_cast 错误值

java - 从 Java 访问 DLL 中的 C# 方法

c++ - 无法使用基类构建 DLL