我有一个C ++结构,我必须从我的C#代码中互操作。
我将我的C#代码编译为平台无关的dll,这意味着我可以在不同的平台上使用相同的C#dll( 32位或64位 - 无所谓),而我分发不同平台的C ++不同。
问题是我必须互操作的C ++结构似乎适用于不同的C#定义。在64位操作系统中,以下结构有效:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct MayDay_CONTEXT
{
public System.UInt32 dwIndex; //previously was int
public System.UInt32 dwVersion; //previously was int
public System.UInt64 hLock; //previously was int
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] reserve;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 56)]
public byte[] bAtr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] bID;
public uint dwAtrLen;
}
但在32位操作系统中,以下结构有效:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct MayDay_CONTEXT
{
public int dwIndex; //previously was int
public int dwVersion; //previously was int
public int hLock; //previously was int
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] reserve;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 56)]
public byte[] bAtr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] bID;
public uint dwAtrLen;
}
无论如何在运行时设置结构成员的类型?我知道我需要一种鸭子打字来做这件事,但也许有更好的解决方案......任何想法?
答案 0 :(得分:2)
IntPtr
(hLock
)会有效吗?否则,您可能不得不在源代码中使用#if定义...... - 即
#if X86
..
#else
..
#endif
并在32位版本中定义X86
符号(内置任何内容)