簡體   English   中英

馬歇爾結構數組

[英]Marshall an array of structs

我正在從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的東西,但是我相信那僅適用於原始類型?

謝謝您的幫助。

這並不是要給出明確的答案,而只是您可以使用stackalloc和不安全代碼完成此操作的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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM