Tag: 工会

C#pinvoke结构使用union和数组

我没有定义正确的C#代码来使用C ++库,它定义了一个带有union和数组的复杂结构,我在执行C ++代码时不断得到一些内存exception,我很确定它是由于这个原因。 c ++结构如下,忽略枚举和其他结构定义(如果需要,我会发布它们,但它们非常简洁) typedef struct { DG_CCTALK_APP_EVT_CODE eEventCode; DG_CCTALK_APP_EVT_TYPE eEventType; int iTime; int iHandle; unsigned char uchAddress; DG_CCTALK_BILL_INFO sBillInfo; int iBillAmount; union { long lData; int iData; unsigned char ucArray[128]; char *cString; void *pvoid; } uData; void *_private; // for use by cctalk app layer } DG_CCTALK_APP_EVT, *PDG_CCTALK_APP_EVT; 而C#代码是这样的: [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Explicit)] public struct Anonymous_92d21a81_2a8b_42f4_af32_f7606aa9cf40 […]

C#中的联合 – 与非对象字段错误对齐或重叠

我正在通过PInvoke编组到本地C dll,它需要以下调用。 private static extern int externalMethod(IntPtr Data, [MarshalAs(UnmanagedType.U4)] ref int dataLength); dataLength参数是通过IntPtr Data参数传递的struct的长度。 如果两者不匹配,则抛出exception。 外部方法使用C Union连接四种类型。 我已经设法使用FieldOffsetAttribute在C#中重新创建了联合。 然后我计算C#union的长度并使用以下方法调用该方法: int len = Marshal.SizeOf(data); IntPtr ptr = Marshal.AllocCoTaskMem(len); externalMethod(ptr, len); 但是,我收到错误System.TypeLoadException : … Could not load type because it contains an object field at offset 0 that is incorrectly aligned or overlapped by a non-object field. […]