32位操作系统中的IntPtr,64位操作系统中的UInt64

时间:2010-05-17 04:26:46

标签: c# interop

我正在尝试从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位操作系统上都能正常工作吗?

3 个答案:

答案 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