我正在尝试从C#进行C ++结构的互操作。结构(在C#包装器中)就是这样的
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct SENSE4_CONTEXT
{
public System.IntPtr dwIndex; //or UInt64, depending on platform.
}
底层的C ++结构有点不正常。在32位操作系统中,dwIndex
必须为IntPtr
才能使互操作工作,但在64位操作系统中,必须为UInt64
才能使互操作工作。
知道如何修改上述结构使其在32位和64位操作系统上都能正常工作吗?
答案 0 :(得分:1)
在64位进程中,IntPtr
的编组应与UInt64
完全相同。
确保将目标平台设置为任何CPU。
要在C#中将其视为UInt64,您可以编写
UInt64 value = (UInt64)s.dwIndex.ToInt64();
如果您需要以32位进程运行,则需要声明两个不同版本的struct
,以及两个不同的方法重载,并选择其中一个使用if
声明。
答案 1 :(得分:1)
如果dwIndex
中的“dw”前缀准确,那么它听起来像DWORD
,这是一个32位无符号整数。在这种情况下,您需要使用UIntPtr
,它在32位上类似UInt32
,在64位上类似UInt64
。
您的C ++程序似乎不太可能需要32位平台上的有符号整数和64位平台上的无符号整数(当然,这并非不可能)。
答案 2 :(得分:0)
您可以使用编译器指令/平台检测,然后执行常见的typedef
:
typedef indexType IntPtr
或
typedef indexType UInt64