【问题标题】:Convert managed C++ class array into C#将托管 C++ 类数组转换为 C#
【发布时间】:2015-08-13 05:03:47
【问题描述】:

我有一个托管的 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# managed-c++


【解决方案1】:

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 之间的互操作,您可以在一个程序集中定义类型并直接在另一个程序集中使用它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2011-10-07
    • 2012-04-08
    相关资源
    最近更新 更多