【发布时间】:2021-12-29 03:16:07
【问题描述】:
我有一个非托管 C++ DLL 和一些使用 [dllimport] 访问它的 C# 代码。我有一个从接口派生的结构(比如 Dog:Animal),在 C++ 端,我有一个从抽象类派生的类(比如 Dog:public Animal)。我想要一个 C++ 函数,它以某种方式将 Animal 作为参数,这样我就可以从 C# 传递 Dog(因为你不能在 C++ 中使用抽象类作为参数)。
【问题讨论】:
我有一个非托管 C++ DLL 和一些使用 [dllimport] 访问它的 C# 代码。我有一个从接口派生的结构(比如 Dog:Animal),在 C++ 端,我有一个从抽象类派生的类(比如 Dog:public Animal)。我想要一个 C++ 函数,它以某种方式将 Animal 作为参数,这样我就可以从 C# 传递 Dog(因为你不能在 C++ 中使用抽象类作为参数)。
【问题讨论】:
一种选择是使用 c++/cli 来定义您的对象模型。这将使 c# 和 c++/cli 代码都可以使用它。
P/invoke 本质上与 C 一样进行方法调用。这意味着它们在不同语言之间高度兼容,但也意味着它们不支持诸如多态之类的东西。
结构本质上只是 C# 和 C 中的一大块数据,您只需要确保布局相同。但是一旦你开始涉及继承,事情就会变得更加复杂,因为 c# 和 c++ 以完全不同的方式表示对象。
也就是说,您仍然可以创建一个 c++ 方法,该方法从 c# 获取狗结构并将其转换为等效的 c++ 类型。
【讨论】: