【问题标题】:Mono Process.Start returning ExitCode 255?Mono Process.Start 返回 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 

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

知道我在搞砸什么吗?

【问题讨论】:

    标签: c# linux mono exit-code


    【解决方案1】:

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

    如果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!'\"");
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 2013-01-30
      相关资源
      最近更新 更多