[英]Passing pointer-to-pointer to c++ class library from c#
我有舊的c庫,並將其全部導出到c ++類庫中。 到目前為止,我在傳遞類型為double **的參數時遇到了問題,該參數只是一個2D數組。 這是我的c ++方法簽名:
public: int GetVariableValues(double **time_values) {
return LegacyGetVariableValues(time_values);}
這是我的C#客戶電話:
double[][] a;
Legacy.GetVariableValues(a);
但是,它不起作用,並且出現類型錯誤。 任何人都知道如何在不使用C#客戶端中不安全標記的情況下通過**(out)。
在這種情況下,您不需要C ++ / CLI庫,固定多維數組比僅固定一維數組困難,因為您需要手動固定內部數組。 如果使用C#執行此操作,則編譯器會自動為您執行此操作。
使用C#,您可以執行以下操作:
[DllImport('legacylibrary.dll')]
public static extern int LegacyGetVariableValues(double[][] timeValues);
有關更多信息,請訪問http://msdn.microsoft.com/zh-cn/library/fzhhdwae(v=vs.110).aspx
編輯:
由於需要C ++ / CLI層,因此需要執行以下操作:
ref class Legacy {
public:
int GetVariableValues(array<array<double> ^> ^values) {
array<GCHandle> ^handles = gcnew array<GCHandle>(values->Length);
double **valuesPtr = calloc(sizeof(double *), values->Length);
int result;
for (int i = 0; i < values->Length; i++) {
handles[i] = GCHandle::Alloc(values[i]);
valuesPtr[i] = (double *)GCHandle::ToIntPtr(handles[i]).GetPointer();
}
result = LegacyGetVariableValues(valuesPtr);
for (int i = 0; i < values->Length; i++) {
handles[i].Free();
}
return result;
}
}
PS:不知道語法是否完全正確,因為我很長時間不寫C ++ / CLI。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.