【问题标题】:C# support both x64 and x86C# 同时支持 x64 和 x86
【发布时间】: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


【解决方案1】:

此问题的最佳解决方案是对所有地址、指针和偏移量使用 IntPtr(),然后构建单独的 x86 和 x64 可执行文件。然后为您希望定位的进程使用相应的可执行文件。

几乎所有流行的记忆工具都使用这种技术,因为它最不让人头疼。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-20
    • 2010-12-07
    • 2011-10-10
    • 2011-04-06
    • 2011-03-14
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    相关资源
    最近更新 更多