C# System.Diagnostics.Process:无法在64位操作系统中启动32位exe文件

3
我有一个用Turbo Pascal编译的32位exe文件,需要启动它。当我使用Windows 7 32位操作系统时,一切正常。但现在我使用的是Windows 7 64位操作系统,出现了以下异常信息:
“指定的可执行文件不是此操作系统平台上的有效应用程序。”
为确保其在32位系统上正常工作,我在32位平台上启动了C#程序 - 它可以工作。
那么,在64位操作系统上如何启动32位exe文件呢?
谢谢。

https://dev59.com/IUfRa4cB1Zd3GeqP_sDe - Morten Bergfall
3
我有点困惑。你是要运行 Turbo Pascal 程序还是 C# 程序?我上次使用 Turbo Pascal 已经是 15 年前的事了,那时候它是 16 位的。 - CoderDennis
你是从C#中启动Turbo Pascal程序吗? - CoderDennis
我正在从一个C#程序中启动一个Pascal程序。我不确定,它可能是用支持32位操作系统的Free Pascal编译的。 - Alex
4个回答

12

Turbo Pascal只能生成16位代码,没有版本能够创建32位可执行文件。运行16位代码需要使用CPU中的实模式仿真支持的虚拟机(虚拟8086模式)。如果处理器正在64位模式下运行,则无法使用此仿真。

在64位操作系统上无法运行16位进程。您可以尝试使用DOSBox仿真器来使其正常运行。


但我可以在32位系统上启动它。 - Alex
4
@Alex - 当然,那个电脑没有运行64位操作系统。 - Hans Passant
1
我同意Hans的观点,请仔细检查您的程序是否真的是16位的,因为Windows 64已经不再支持16位。您可以使用像EXE Explorer这样的程序进行检查。 - Scott Chamberlain
你说得对。Pascal程序确实是16位的。我用Free Pascal重新编译了它(我有源代码),现在它可以正常工作了。谢谢! - Alex

2
你可以从64位的应用程序中启动32位的应用程序。
C#示例1:
var processStartInfo = new ProcessStartInfo("C:\MyApp.exe");
var process = new Process { StartInfo = processStartInfo };
process.Start();
process.WaitForExit();

C#示例2:

System.Diagnostics.Process.Start("C:\MyApp.exe");

2
如果你在.NET(C#)应用程序中启动32位exe,则需要将你的.NET应用程序目标设置为x86。如果它被设置为任何CPU,则在64位操作系统上运行为64位进程,因此无法启动32位进程。
编辑:这篇MSDN文章解释了如何修改此设置:http://msdn.microsoft.com/en-us/library/5b4eyb0k.aspx 编辑2:正如Gabe指出的那样,64位应用程序没有理由不能启动32位exe。我知道你不能在64位应用程序中使用32位DLL。只是想尝试一下,因为文档没有指定在使用System.Diagnostics.Process启动exe时是否存在同样的限制。

Dennis:64位应用程序没有理由无法启动32位应用程序。 - Gabe
1
@Gabe 我想你是对的。也许我在考虑从64位应用程序中使用32位DLL。 - CoderDennis

1

我认为 Turbo Pascal 没有 64 位编译器,所以你唯一的选择是针对 32 位环境编译你的应用程序。


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