32位操作系统使用IntPtr,64位操作系统使用UInt64。

4

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


1
你是在谈论“操作系统”,无论你是否在WOW64中运行?因为在32位进程中,“IntPtr”将是32位,在64位进程中将是64位... - Dean Harding
@codeka,我在谈论32位或64位进程。我想在32位操作系统上运行32位进程,在64位操作系统上运行64位进程。 - Graviton
3个回答

1
在64位进程中,IntPtr 应该与 UInt64 完全一样进行封送。
确保将目标平台设置为 Any CPU。
在 C# 中将其视为 UInt64,您可以编写
UInt64 value = (UInt64)s.dwIndex.ToInt64();

如果您需要作为32位进程运行,则需要声明两个不同版本的struct,以及接受它的方法的两个不同重载,并使用if语句选择其中一个。


这就是问题所在;IntPtr 应该被编组为 UInt64,但它没有。 - Graviton
1
有什么区别?它们都是八个字节。 - SLaks
你的意思是它需要是无符号的吗?如果是这样,你可以使用 UIntPtr:http://msdn.microsoft.com/zh-cn/library/system.uintptr%28v=VS.71%29.aspx - Dean Harding
@SLaks,不应该有区别。但是我不知道为什么会出现这样的问题。 - Graviton
1
SLaks是正确的。在64位进程中,对于Interop来说,UInt64和IntPtr之间没有区别。 - Josh
显示剩余4条评论

1
如果dwIndex中的“dw”前缀是准确的,那么它听起来像是一个DWORD,这是一个32位的无符号整数。在这种情况下,您需要使用UIntPtr,它将在32位上类似于UInt32,在64位上类似于UInt64
看起来您的C++程序不太可能在32位平台上需要有符号整数,在64位平台上需要无符号整数(当然这并非不可能)。

DWORD 类型是一个 32 位无符号整数,无论操作系统是 32 位还是 64 位。 - JaredPar

0
你可以使用编译器指令/平台检测,然后进行常见的typedef定义:
typedef indexType IntPtr 或者
typedef indexType UInt64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接