将C结构移植到C#
我将C代码移植到C#,我有些疑惑。
考虑这个结构:
typedef struct { uint32_t w; uint32_t h; uint32_t f_cc; uint32_t st; unsigned char *pl[4]; int32_t strd[4]; void (*done)(void *thisobj); void *e_cc; uint32_t rsrvd2; uint32_t rsrvd3; } f_tt;
我已经完成了这个并且它不起作用(可能是因为它错了: – /):
[StructLayout(LayoutKind.Sequential, Pack = 1)] public struct f_tt { public uint w; public uint h; public uint f_cc; public uint st; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public Byte[] pl; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public int[] strd; public delegate void done(IntPtr thisobj); public delegate void e_cc(); public uint rsrvd2; public uint rsrvd3; }
有人可以告诉我如何做这个ic#?
void (*done)(void *thisobj); void *e_cc;
谢谢!
在我们来代表之前,我怀疑你打包结构是错误的。 这样做非常不寻常。 只有在C代码中找到包#pragma
时才这样做。
e_cc
字段不是函数指针。 它只是一个无效指针。 在C#中是IntPtr
。
pl
成员是一个由4个指针组成的数组。 我不太确定它们包含什么,但肯定你可以像这样编组:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public IntPtr[] pl;
这使您可以通过手动干预来填充数组或读取其内容。 这可能是由编组人员完成的,但是如果不知道互操作的语义,我就不能说如何做到这一点。
至于done
,您应该在结构外声明委托。 像这样:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void doneDelegate(IntPtr thisobj);
这里我假设调用约定是cdecl
因为C代码中没有任何内容可以说。
把它们放在一起你有:
上述就是C#学习教程:将C结构移植到C#分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void doneFunc(IntPtr thisobj); [StructLayout(LayoutKind.Sequential)] public struct f_tt { public uint w; public uint h; public uint f_cc; public uint st; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public IntPtr[] pl; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public int[] strd; public doneDelegate done; public IntPtr e_cc; public uint rsrvd2; public uint rsrvd3; }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1005716.html