【发布时间】:2014-02-04 16:23:00
【问题描述】:
所以,我正在编写一个 C++/CLI 包装器,我希望它与来自引用的托管 (C#) dll 的对象进行交互。更具体地说,在我的 C++/CLI 项目中,我希望有这样的类:
public ref class MyClass
{
public:
void InputPoints(array<Point3d^>^ ptsIn);
};
其中,“Point3d”是引用的托管 dll 中的一个对象 - 称之为“MyGeometryDLL.dll”。这编译没有任何问题,但是当我在 C# 项目中使用包装器(也引用“MyGeometryDLL.dll”)时,我无法将 Point3d 直接传递给包装器,即智能感知检测到:
void MyClass.InputPoints(ValueType[] ptsIn);
如何将 Point3d 直接传递给包装器?
【问题讨论】:
-
问题出在 Point3d 上,它不是托管类型。你需要声明,比如说,
public value class Point3d { /* ... */ };。 -
嗨,汉斯,谢谢!但是,现在我的 C# 项目期望返回类型为“MyWrapper.Point3d[]”。我仍然不清楚如何将其转换为 MyGeometryDLL.Point3d。
-
如果你做
public value class,那是一个值类型,所以你需要删除Point3d上的^:array<Point3d>^。如果您希望它成为引用类型,请使用public ref class,并保留^。 -
您不能将托管结构转换为非托管结构,它们通常没有相同的布局。您可以使用 Marshal::StructureToPtr() 进行转换,但这对于简单的结构来说往往是过度的。仅分配结构成员是更简单的方法。这确实倾向于调用“真的???”感叹。对真的。结构布局是一个非常讨厌的实现细节。
-
顺便说一句,大卫确实提出了一个有效点,如果 Point3d 实际上是一个托管结构,那么你必须省略 ^ 帽子。它应该只用于引用类型。