gpt4 book ai didi

c# - 使用 PInvoke char** (C -> C#) 更正返回值

转载 作者:太空宇宙 更新时间:2023-11-04 01:56:47 51 4
gpt4 key购买 nike

我的问题是我正在使用 C# 中的 MATLAB API,而这是给我带来麻烦的函数。

C 代码:

EXTERN_C char ** matGetDir(MATFile * pMF, int *num); 

我希望它能工作,但不幸的是它没有(C# 代码):

[DllImport("libmat.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern string[] matGetDir(IntPtr matFile, ref int num);

如果我用 IntPtr 而不是 string[] 我可以调用这个函数,但是我不知道如何从 IntPtr< 转换代码string[]

编辑1:
我也尝试使用这些属性,但它失败并出现错误:无法编码“返回值”:无效的托管/非托管类型组合。

[return: MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)]
private static extern string[] matGetDir(IntPtr matFile, ref int num);

最佳答案

您不能告诉 p/invoke 编码器如何为您编码它。你需要手动完成。关于您的问题,有趣的一件事是您没有提供有关此 char** 真正含义的任何详细信息。了解类型并没有完全定义参数或返回值的语义对您来说非常重要。

我们很容易猜到,但最好在文档中查找:http://uk.mathworks.com/help/matlab/apiref/matgetdir.html

Arguments

mfp

Pointer to MAT-file information

num

Pointer to the variable containing the number of mxArrays in the MAT-file

Returns

Pointer to an internal array containing pointers to the names of the mxArrays in the MAT-file pointed to by mfp. In C, each name is a NULL-terminated string. The num output argument is the length of the internal array (number of mxArrays in the MAT-file). If num is zero, mfp contains no arrays.

matGetDir returns NULL in C (0 in Fortran). If matGetDir fails, sets num to a negative number.

所以,我们这样声明 p/invoke:

[DllImport("libmat.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr matGetDir(IntPtr matFile, out int num);

这样调用它:

int num;
IntPtr matFile = ...;
IntPtr namesPtr = matGetDir(mayFile, out num);
if (names == IntPtr.Zero)
// handle error
string[] names = new string[num];
for (int i = 0; i < num; i++)
{
int offset = i * Marshal.SizeOf(typeof(IntPtr));
names[i] = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(namesPtr, offset));
}

关于c# - 使用 PInvoke char** (C -> C#) 更正返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33343506/

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