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

本文关键字:转换 数组 c++ | 更新日期: 2023-09-27 18:07:32

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

托管c++代码:

public ref class Sample
{
public:
   double Open;
   double Close;
};
public ref class ManagedTest
{
  array<Sample^>^ ManagedTest::TestFunction()
  {
     //body
  }
};

TestFunction()在c#应用程序中被调用。我在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#类数组?

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

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不同,在p/invoke中需要在两个程序集中定义类型并确保二进制布局匹配。通过c#和c++/CLI之间的互操作,您可以在一个程序集中定义类型,并直接在另一个程序集中使用它们。