gpt4 book ai didi

c# - 从 C# 调用接受调用者分配的结构数组的 C 函数

转载 作者:行者123 更新时间:2023-11-30 18:06:42 26 4
gpt4 key购买 nike

我有以下 C 结构

struct XYZ
{
void *a;
char fn[MAX_FN];
unsigned long l;
unsigned long o;
};

我想从 C# 中调用以下函数:

extern "C"  int     func(int handle, int *numEntries, XYZ *xyzTbl);

其中 xyzTbl 是由调用者分配的大小为 numEntires 的 XYZ 数组

我定义了以下 C# 结构:

[StructLayoutAttribute(Sequential, CharSet = CharSet.Ansi)]
public struct XYZ
{
public System.IntPtr rva;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 128)]
public string fn;
public uint l;
public uint o;
}

和一个方法:

 [DllImport(@"xyzdll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern Int32 func(Int32 handle, ref Int32 numntries,
[MarshalAs(UnmanagedType.LPArray)] XYZ[] arr);

然后我尝试调用函数:

XYZ xyz = new XYZ[numEntries];
for (...) xyz[i] = new XYZ();
func(handle,numEntries,xyz);

当然不行。有人可以阐明我做错了什么吗?

最佳答案

[StructLayoutAttribute(Sequential, CharSet = CharSet.Ansi)]
public struct XYZ
{
public System.IntPtr rva;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 128)]
public string fn;
public uint l;
public uint o;
}

那些 uint 不应该是 ulong 吗?另外,MAX_FN 是 128 对吧?

XYZ xyz = new XYZ[numEntries];
for (...) xyz[i] = new XYZ();

XYZ 是一个值类型(struct),所以这里的第二行是多余的(structs 总是被初始化)

 [DllImport(@"xyzdll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern Int32 func(Int32 handle, ref Int32 numntries,
[MarshalAs(UnmanagedType.LPArray)] XYZ[] arr);

[MarshalAs(UnmanagedType.LPArray)] 是多余的,编译器会认为它是一个结构数组。

关于c# - 从 C# 调用接受调用者分配的结构数组的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4577603/

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