【问题标题】:Marshall an array of structsMarshall 结构数组
【发布时间】:2010-10-28 15:22:40
【问题描述】:

我正在从 C# 调用 C++ 函数。作为参数,它接收一个指向结构数组的指针。

struct A 
{
    int data;
}

int CFunction (A* pointerToFirstElementOfArray, int NumberOfArrayElements)

在 C# 中,我创建了相同的结构(作为一个类)并且我正确地编组它(数组中的第一个元素被正确接收)。这是我对 C++ 结构的 C# 定义:

[StructLayout(LayoutKind.Sequential), Serializable]
class A
{
    int data;
}

第一个元素被正确读取,所以我知道结构中的所有字段都被正确编组。当我尝试发送元素数组时会出现问题。 如何创建一个位于单个内存块(块)中的类数组,以便 C++ 函数可以递增指向该数组的指针?

我想我需要类似于 stackalloc 的东西,但我相信它只适用于原始类型?

感谢您的帮助。

【问题讨论】:

  • 你知道你在编译时发送的数组的大小吗?
  • @ohadsc 不,它是一个数组的长度(不同的数组),它只有在运行时才知道。

标签: c# arrays marshalling


【解决方案1】:

这不是一个明确的答案,而只是您可以使用stackalloc 和不安全代码完成此操作的示例。

public unsafe class Example
{
  [DllImport("library.dll")]
  private static extern int CFunction(A* pointerToFirstElementOfArray, int NumberOfArrayElements); 

  public void DoSomething()
  {
    A* a = stackalloc A[LENGTH];
    CFunction(a, LENGTH);
  }
}

另外,请注意 API 接受的结构的打包。您可能不得不使用StructLayout 属性的Pack 属性。我相信默认值为 4,但有些 API 期望为 1。

编辑:

为此,您必须将 A 的声明从类更改为结构。

public struct A
{
  public int data;
}

【讨论】:

  • 我收到以下错误:无法获取托管类型 ('A') 的地址、大小或声明指向托管类型 ('A') 的指针
  • @Rekreativc:这很奇怪。我在发布之前测试了代码。我实际上在我的一些代码中使用了这种方法,并且效果很好。一定有其他事情发生。
猜你喜欢
  • 2011-08-13
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多