簡體   English   中英

從C#向C ++類庫傳遞指針到指針

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

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