[英]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.