簡體   English   中英

如何在C#中PInvoke另一個結構內的結構數組

[英]How to PInvoke in C# an array of structs inside another struct

從C#.NET,我正在嘗試使用此簽名從C ++程序集中調用方法(無法訪問源代碼)

result_code get_values(values_report_type *values_report)

其中values_report是一個指向的一個結構values_report_type含有我查詢其值是由該方法返回。 該結構如下所示:

typedef struct{
    int countOfValues;
    values_type* values;
    const char* name;
} values_report_type;

其中values是struct values_type數組

這就是我可能會想到的問題:我正在使用的C ++程序集除了定義之外沒有提供任何有關values_type結構內容的信息

typedef struct values_type_struct *values_type

根據文檔,此隱私是故意的。

因此,我的C#PInvoke現在看起來像這樣:

[DllImport("MyLibrary.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
internal static extern result_code get_values(out values_report_type values_report);

internal struct values_report_type{
    int countOfValues;
    IntPtr values;
    string name;
}

那工作正常,並為我提供了一個指向values結構的指針,但是我需要的是訪問values_type結構的數組,並獲得一個指向數組中每個項目的指針(指向每個項目的指針是我所需要的,因為我沒有沒有對struct內容的定義)。 但是我想不出一種方法來實現這一點,特別是因為該庫限制了我對結構的理解(甚至沒有給出長度)。 在C ++中,由countOfValues定義的每個項目都將類似於values_report.values[0]等,但是當將其編組到.NET時,我不知道使它起作用的方法。

有沒有辦法通過編組在C#中解決此問題?

values不是struct數組。 它是指向 struct的指針數組。

根據注釋並查看代碼,似乎您沒有結構本身的定義。 這就是所謂的不透明指針。 您不需要知道結構的大小,只需處理指向結構的指針,然后將其傳遞回庫即可。

像這樣從數組讀取不透明指針值:

IntPtr Value = Marshal.ReadIntPtr(values_report.values, i*IntPtr.Size);

由此獲得第i 值。

暫無
暫無

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

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