gpt4 book ai didi

c# - 从 C# 将指针到指针传递给 C++ 类库

转载 作者:太空宇宙 更新时间:2023-11-04 08:38:24 25 4
gpt4 key购买 nike

我有遗留的 c 库并将其全部导出到 c++ 类库中。到目前为止,我在传递 double** 类型的参数时遇到问题,它只是一个二维数组。这是我的 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/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了,不知道语法是否完全正确。

关于c# - 从 C# 将指针到指针传递给 C++ 类库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25120928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com