将指针指向c#的c ++类库传递

时间:2014-08-04 14:22:57

标签: c# c++ c pointers

我有遗留的c库,并将其全部导出到c ++类库中。到目前为止,我遇到了传递double **类型的参数的问题,它只是一个2D数组。这是我的c ++方法签名:

public:  int  GetVariableValues(double **time_values) {
return LegacyGetVariableValues(time_values);}

这是我的c#客户电话:

double[][] a;
Legacy.GetVariableValues(a);

然而它不起作用,我得到类型错误。 任何人都知道如何在不使用C#客户端中的不安全标记的情况下传递**(out)。

1 个答案:

答案 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。