【问题标题】:Forcing a C# 64bit application to run as 32bit?强制 C# 64 位应用程序以 32 位运行?
【发布时间】:2012-05-18 03:57:00
【问题描述】:

假设当我编译了一个托管程序集时,我已经强制它为 64 位(使用配置管理器)。比方说,编译后我想将该应用程序作为 32 位进程运行。我可以强制它再次成为 32 位吗? 我尝试尝试编辑 PEHeader(Machine 和 32BitOnly 字段),但应用程序无法在 32 位平台上启动。
当我强制将其编译为 64 位时,生成的 IL 是否存在差异? (与 AnyCPU 相比)

【问题讨论】:

  • 这引出了一个问题——为什么?只是好奇。与 Any CPU 相比有何优势?
  • @Preet:与 32 位 COM 组件的交互
  • “无法启动”我假设您看到了一个错误,什么错误?
  • @Binary Worrier,“...不是有效的 win32 应用程序”

标签: c# 64-bit


【解决方案1】:
【解决方案2】:

我不相信 IL 有区别,非托管标头有区别。 64 位模式编译带有PE32+ 格式头(即64 位)的EXE。所以仅仅改变一个标志不会改变EXE的实际格式。这就是您收到错误消息的原因,即它不是有效的 32 位应用程序,它不是,它是 64 位应用程序并且 32 位 Window 无法解析 PE32+ 标头。

您必须将 EXE 完全重写为 PE32 格式,所以这可能是不可能的。

你不能重新编译还是只是为了你自己的利益?

【讨论】:

  • 自己的兴趣.. 为什么编译器会使用 PE32+ 格式?为什么不使用常规格式,只在标题的 .Net 部分添加适当的标志? (就像 AnyCPU/32bit 一样)。有什么好处?
  • 我不知道。我的猜测是,这是一种确保代码仅在 64 位系统上运行的廉价方法——通过制作一个只有 64 位操作系统才能读取的文件,他们不必在运行时编写任何代码来处理这种情况。
  • 在某些时候,您必须在程序集中包含本机代码,以便操作系统读取并理解如何处理该文件。最好的描述方式是“在某些时候橡胶必须接触道路”。不存在通用 PE(便携式可执行文件)格式,因为这两个操作系统在内存管理和类型方面使用不同的语言。
猜你喜欢
  • 1970-01-01
  • 2013-06-06
  • 2020-03-20
  • 2010-10-01
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
相关资源
最近更新 更多