在 C++ 和 C# 之间编组类实例的指针

Posted

技术标签:

【中文标题】在 C++ 和 C# 之间编组类实例的指针【英文标题】:Marshalling a class intance's pointer between C++ and C# 【发布时间】:2009-07-24 07:30:09 【问题描述】:

我有一个 ActiveX 控件(用 C++ 编写)并从 C# 项目中引用它的 RCW 程序集(由 aximp.exe 创建)。

在实现 Ax 控件的 C++ 代码中,我有一个实现接口的类,该接口作为 Ax 控件的属性公开。

查看生成的 RCW 程序集,我看到了界面。我可以尝试声明一个它的类型的变量。

现在,如果我只有一个指向在内存中实现接口的 C++ 类实例的指针,是否可以使用该指针将其数据编组到表示接口的托管 C# 对象中?

请注意,它不是接口指针。它是指向我拥有的类的实例的指针。

【问题讨论】:

【参考方案1】:

您可能想尝试一下 C++/CLI。编写在 C++ 和 C# 之间进行互操作的代码是一件轻而易举的事。

【讨论】:

我目前正在这样做。我有一个中间托管 C++ 项目来连接两者。但我希望有更好、更清洁的方法来实现它。 在托管和非托管类型之间实现互操作的最佳、最简洁的方法是 C++/CLI 包装器。【参考方案2】:

我认为这里有两个问题。

您能否将“this”指针编组为托管代码,但不能编组为特定接口

是的。这可以通过在 C# 应用程序中实现 COM 接口,然后将“this”作为参数之一传递来实现。接受“this”指针的托管类型应该是 Int32 或 Int64(无符号 OK),具体取决于您的平台

我可以用这个指针做任何有用的事情吗

是和否。

您不能直接在此指针上调用任何实例方法,因为没有可以将值转换为的类型。所以它不能像使用 COM 接口那样使用。

您可以做的是在您的本机应用程序中定义一组 extern "C" 方法,这些方法将该类型的指针作为第一个参数,然后在该对象上调用特定方法。然后,您可以使用 C# PInvoke 进入该方法

C++

void SomeType_SomeMethod(SomeType* pSomeType) 
  pSomeType->SomeMethod();

C#

[DllImport("YourDll.dll")]
public static extern void SomeType_SomeMethod(IntPtr pSomeType);

【讨论】:

将指针传递给 COM 接口的 C# 实现者?那么类中的指针是如何使用的呢? 对于第二个选项,我通过将托管 C# 类中的委托映射到非托管 C++ 类中的函数指针来实现相同的效果。感谢您的建议。

以上是关于在 C++ 和 C# 之间编组类实例的指针的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中传递 IntPtr 指针后,在非托管 C++ 代码中分配数组,编组类型

P/Invoke 编组和解组 C# 和非托管 DLL 之间的二维数组、结构和指针

如何将指向 char[256] 数组的指针从 C++ 编组到 C#

传递结构时可以将指针编组到数组吗?

创建要在 C# 中编组的 C++ Dll 的最佳实践 [关闭]

在 C# 和非托管 C++ 之间传递自定义对象