【发布时间】:2011-06-02 10:23:03
【问题描述】:
我有以下 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);
当然不行。有人可以阐明我做错了什么吗?
【问题讨论】:
-
顺便问一下,错误是什么?
-
调用
func时,第二个参数前面需要一个ref,因为它在函数声明中是ref。
标签: c# pinvoke marshalling