我有遗留的c库,并将其全部导出到c ++类库中。到目前为止,我遇到了传递double **类型的参数的问题,它只是一个2D数组。这是我的c ++方法签名:
public: int GetVariableValues(double **time_values) {
return LegacyGetVariableValues(time_values);}
这是我的c#客户电话:
double[][] a;
Legacy.GetVariableValues(a);
然而它不起作用,我得到类型错误。 任何人都知道如何在不使用C#客户端中的不安全标记的情况下传递**(out)。
答案 0 :(得分:2)
在这种情况下你不需要C ++ / CLI库,固定多维数组比仅仅固定一维数组更困难,因为你需要手动固定内部数组。 如果使用C#执行此操作,编译器会自动为您执行此操作。
使用C#,您可以这样做:
[DllImport('legacylibrary.dll')]
public static extern int LegacyGetVariableValues(double[][] timeValues);
如需进一步阅读,请查看http://msdn.microsoft.com/en-us/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。