gpt4 book ai didi

c# - PInvoke - 方法的类型签名与 PInvoke 不兼容

转载 作者:行者123 更新时间:2023-11-28 07:45:13 32 4
gpt4 key购买 nike

这是我尝试在 C# 中使用的头文件签名和 C 代码:

__declspec(dllexport) emxArray_real_T *emxCreateWrapper_real_T(real_T *data, int32_T rows, int32_T cols);

struct emxArray_real_T
{
real_T *data;
int32_T *size;
int32_T allocatedSize;
int32_T numDimensions;
boolean_T canFreeData;
};

emxArray_real_T *emxCreateWrapper_real_T(real_T *data, int32_T rows, int32_T
cols)
{
emxArray_real_T *emx;
int32_T size[2];
int32_T numEl;
int32_T i;
size[0] = rows;
size[1] = cols;
emxInit_real_T(&emx, 2);
numEl = 1;
for (i = 0; i < 2; i++) {
numEl *= size[i];
emx->size[i] = size[i];
}

emx->data = data;
emx->numDimensions = 2;
emx->allocatedSize = numEl;
emx->canFreeData = FALSE;
return emx;
}

我目前正尝试在 C# 中按如下方式调用它:

[DllImport(@"C:\bla\bla.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern emxArray_real_T emxCreateWrapper_real_T(double[,] data, int rows, int cols);

double[,] array2D = new double[,] { { 1 }, { 3 }, { 5 }, { 7 } };
var x = emxCreateWrapper_real_T(array2D, 1, 4);

但得到:

Method's type signature is not PInvoke compatible.

emxArray_real_T 目前看起来像这样:

[StructLayout(LayoutKind.Sequential)]
public struct emxArray_real_T
{
//public IntPtr data;
//public IntPtr size;
double[] data;
int[] size;
public int allocatedSize;
public int numDimensions;
[MarshalAs(UnmanagedType.U1)]
public bool canFreeData;
}

最佳答案

存在多个问题。首先,您的 C++ 函数返回一个指针 (emxArray_real_T *),但您的导入声明返回一个结构。那行不通。此外,您在导入声明中将数据声明为 double[,],但在结构中声明为 double[]。建议:

  • 用类替换结构
  • 确定数据应该是 double[] 还是 double[,]
  • 同时检查 real_T 的最终大小。我认为这是一个平台相关变量,可以是 float(32 位)或 double(64 位)。

关于c# - PInvoke - 方法的类型签名与 PInvoke 不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15038735/

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