将托管C ++类数组转换为C#

时间:2015-08-13 05:03:48

标签: c# managed-c++

我有一个托管C ++函数,它返回一个类数组:

托管C ++代码:

public ref class Sample
{
public:
   double Open;
   double Close;
};

public ref class ManagedTest
{
  array<Sample^>^ ManagedTest::TestFunction()
  {
     //body
  }
};
在C#应用程序中调用

TestFunction()。我在C#中创建了相同的Sample类,并尝试获取返回值。但是我收到有关转换的编译错误。

这是我的C#代码:

[StructLayout(LayoutKind.Sequential, Size = 100), Serializable]
public class Sample
{
public double Open;
public double Close;
}
//No. 100 I can manage, just written a random number

Sample[] randomValues = new Sample[100]; //Array of random numbers
GCHandle handle = GCHandle.Alloc(randomValues, GCHandleType.Pinned);
var randPtr = handle.AddrOfPinnedObject();
var test = new ManagedTest();
randPtr = test.TestFunction();

如何将此托管C ++类数组转换为C#one?

1 个答案:

答案 0 :(得分:2)

C ++代码定义函数返回的类型。在C#代码中,您定义了另一种类型,与C#代码中使用的类型无关。您可以丢弃所有C#代码并简单地写:

var test = new ManagedTest();
var randPtr = test.TestFunction();

就是这样。如果你想明确这些类型,那么它将是:

ManagedTest test = new ManagedTest();
Sample[] randPtr = test.TestFunction();

请注意,您必须丢弃问题中的所有C#代码。在上面的摘录中,Sample是C ++程序集中定义的类型。

这是使用C ++ / CLI的互操作的关键点。编译器能够使用在其他程序集中声明的类型。这与p / invoke不同,您需要在两个程序集中定义类型并确保二进制布局匹配。通过C#和C ++ / CLI之间的互操作,您可以在一个程序集中定义类型,并在另一个程序集中直接使用它们。

相关问题