Mono Process.Start 返回 ExitCode 255?

Posted

技术标签:

【中文标题】Mono Process.Start 返回 ExitCode 255?【英文标题】:Mono Process.Start returning ExitCode 255? 【发布时间】:2011-04-06 17:55:56 【问题描述】:

我有一个在 CentOS 5.5 上运行的简单 C# Mono 2.10 应用程序,它调用

Process.Start("/path/to/myapp/myapp.exe","-someArgs");    

我能够取回进程 ID 并使用

运行
mono --trace=N:System.Diagnostics

显示一个似乎表明 Process.Start 返回 true 的堆栈:

LEAVE: System.Diagnostics.Process:Start_noshell (System.Diagnostics.ProcessStartInfo,System.Diagnostics.Process)TRUE:1
LEAVE: System.Diagnostics.Process:Start_common (System.Diagnostics.ProcessStartInfo,System.Diagnostics.Process)TRUE:1
LEAVE: System.Diagnostics.Process:Start ()TRUE:1
LEAVE: (wrapper remoting-invoke-with-check) System.Diagnostics.Process:Start ()TRUE:1

我认为这意味着该进程是在没有 FileNotFound 等异常的情况下生成的。

但是,该进程似乎立即退出,我得到的退出代码是 255。我认为这是一个具有明显含义的 Linux 退出代码,但我在试管上找不到任何用处。

直接通过启动完全相同的应用程序时

mono /path/to/myapp/myapp.exe -someArgs 

应用程序正常启动,没有任何异常,并按预期工作。

知道我在搞砸什么吗?

【问题讨论】:

【参考方案1】:

文件/path/to/myapp/myapp.exe 是可执行文件(chmod +x /path/to/myapp/myapp.exe)吗? Mono 2.10 确实检查它正在启动的进程是否是托管可执行文件,如果是,将隐式使用当前正在执行的 mono 来启动新进程,例如Mono's CreateProcess source。 CreateProcess 包含所有详细信息,但其中包括:

The process must be executable The process must be a managed binary

如果Process.Start 仍然无法启动您的进程,那么这可能是一个单声道错误,我们很乐意为此报告一个错误。 :-)

【讨论】:

好的,所以你会以新的答案获胜,以获得明确的解释。如果我在我的 exe 上使用 ls -l,则权限是 -rwxr-xr-x 因此,即使在 myexe 上强制执行 chmod +x (它已经是)它仍然无法启动我的进程。那么单声道中的错误呢?【参考方案2】:

尝试启动“mono”作为进程,并使用“/path/to/myapp/myapp.exe -someArgs”作为命令行参数。这将导致 Process.Start 的行为更像您的正常应用程序启动。

【讨论】:

我想过尝试一下。让我看看会发生什么 太棒了,解决了问题。有道理,我正在启动的“应用程序”是“mono”而不是“myapp.exe”,谢谢 这应该不是必需的,因为 mono 的 CreateProcess() 显式检查托管可执行文件并隐式使用相同的 mono 来启动它们。 “/path/to/myapp/myapp.exe”是否可执行(chmod +x)?另见:github.com/mono/mono/blob/master/mono/io-layer/processes.c#L812【参考方案3】:

问题在于 Linux 本身并不知道它需要使用 Mono 来运行 CIL .exe 二进制文件,所以它尝试使用 ld-linux.so 作为加载程序,但显然失败了。

您需要使用 /path/to/myapp.exe 作为 arg 调用单声道。

FWIW,退出代码 255 只是“错误”。

【讨论】:

我认为 255 没用,感谢您提供的信息。里德领先你几分钟,但两个答案都是正确的。谢谢【参考方案4】:

您可以使用 Process.Start 的这种重载来启动进程:

Process.Start("/bin/bash", "-c \"echo 'Hello World!'\"");

不知道为什么,但它有效。

【讨论】:

以上是关于Mono Process.Start 返回 ExitCode 255?的主要内容,如果未能解决你的问题,请参考以下文章

从 Process.Start 返回不同的引用

我必须处理 Process.Start(url) 吗?

C# 中的 Process.Start 与 Process `p = new Process()`?

使用 Process.start 设置环境变量

Process.Start 功能

Process.Start() 啥都不做