强制C#64位应用程序以32位运行?

强制C#64位应用程序以32位运行?,c#,64-bit,C#,64 Bit,假设在编译托管程序集时,我强制它为64位(使用配置管理器)。比如说,在编译之后,我希望以32位进程的形式运行该应用程序。我可以强迫它再次为32位吗? 我试着绕过并编辑PEHeader(机器和32位字段),但应用程序无法在32位平台上启动。 当我强制将其编译为64位时,生成的IL是否有差异?(与任何CPU相比)我不相信IL中有什么区别,非托管头中有什么区别。64位模式编译带有格式头(即64位)的EXE。因此,仅仅更改一个标志不会更改EXE的实际格式。这就是您得到错误的原因,它不是一个有效的32位应

假设在编译托管程序集时,我强制它为64位(使用配置管理器)。比如说,在编译之后,我希望以32位进程的形式运行该应用程序。我可以强迫它再次为32位吗? 我试着绕过并编辑PEHeader(机器和32位字段),但应用程序无法在32位平台上启动。

当我强制将其编译为64位时,生成的IL是否有差异?(与任何CPU相比)

我不相信IL中有什么区别,非托管头中有什么区别。64位模式编译带有格式头(即64位)的EXE。因此,仅仅更改一个标志不会更改EXE的实际格式。这就是您得到错误的原因,它不是一个有效的32位应用程序,它不是,它是一个64位应用程序,32位窗口无法解析PE32+头

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


你不能重新编译吗?或者这只是为了你自己的利益吗?

我不相信IL和非托管头之间有什么区别。64位模式编译带有格式头(即64位)的EXE。因此,仅仅更改一个标志不会更改EXE的实际格式。这就是您得到错误的原因,它不是一个有效的32位应用程序,它不是,它是一个64位应用程序,32位窗口无法解析PE32+头

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


你不能只是重新编译吗?或者这仅仅是为了你自己的利益吗?

我建议使用这里讨论的众多方法中的一种:

我建议使用这里讨论的众多方法中的一种:

这回避了一个问题-为什么?只是好奇。与任何CPU相比,有什么好处?@Preet:与32位COM组件的交互“不会启动”我假设您看到错误,什么错误?@Binary Worrier,“…不是有效的win32应用程序”这就引出了一个问题-为什么?只是好奇。与任何CPU相比,有什么好处?@Preet:与32位COM组件的交互“不会启动”我假设您看到了错误,什么错误?@Binary Worrier,“…不是有效的win32应用程序”自己感兴趣。。为什么编译器会使用PE32+格式?为什么不使用常规格式,只在标题的.Net部分添加适当的标志?(与任何CPU/32位一样)。有什么好处?我不知道。我的猜测是,这是一种确保代码只在64位系统上运行的廉价方法——通过生成一个只有64位操作系统才能读取的文件,他们不必在运行时编写任何代码来处理这种情况。在某个时刻,你必须在程序集中有本机代码,操作系统才能读取并理解如何处理该文件。最好的描述方式是“在某个点上,橡胶必须接触到道路”。没有通用的PE(可移植可执行文件)格式,因为这两个操作系统在内存管理和类型方面使用不同的语言。。为什么编译器会使用PE32+格式?为什么不使用常规格式,只在标题的.Net部分添加适当的标志?(与任何CPU/32位一样)。有什么好处?我不知道。我的猜测是,这是一种确保代码只在64位系统上运行的廉价方法——通过生成一个只有64位操作系统才能读取的文件,他们不必在运行时编写任何代码来处理这种情况。在某个时刻,你必须在程序集中有本机代码,操作系统才能读取并理解如何处理该文件。最好的描述方式是“在某个点上,橡胶必须接触到道路”。没有通用PE(可移植可执行文件)格式,因为这两个操作系统在内存管理和类型方面使用不同的语言。