【发布时间】:2019-03-22 09:52:52
【问题描述】:
我正在开发一个 C# 项目,我必须同时支持 x64 和 x86 架构。 我必须调用一些 kernel32 函数,例如 WriteProcessMemory。
在 WriteProcessMemory 的情况下,“SIZE_T nSize”取决于我编译的架构,uint32 或 uint64。我考虑过使用 IntPtr,因为它也依赖于架构,但我仍然需要在之后检查大小以了解我应该转换为 uint32 还是 uint64。
有更好的方法吗?
【问题讨论】:
-
首先,不只是WriteProcessMemory,很多个win32函数都依赖于整数大小,所以它们使用DWORD_PTR、INT_PTR和size_t。最好的方法是避免转换并使用相同的类型,或者在序列化的情况下使用最大的类型。
-
是的,size_t 通常被声明为 IntPtr。您不需要将 IntPtr 转换为 32 或 64 太多。如果您需要它,则意味着某处未按应有的方式声明某些内容。或者也许你有代码要显示。
-
“有更好的方法吗?”使这是一个基于意见的问题。
-
好吧,在 WriteProcessMemory 的情况下,最后一个参数将是一个 IntPtr,用于返回函数写入的字节数。在这种情况下,我必须使用 IntPtr 类的 .Int32()/.Int64() 方法来获取该值,对吧?
-
写入的字节数不能超过您要求写入的字节数。假设您不需要写入超过 32 位整数的内容,您可以将该 32 位整数转换为
IntPtr作为输入,并将输出转换回一个 32 位整数。因此,您寻找的更好的方法可能是完全避免检查大小。只需使用 32 位整数,在IntPtr之间进行转换,然后让运行时处理IntPtr的不同大小。
标签: c# winapi architecture 64-bit pinvoke