3

我有一个在 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 

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

知道我在搞砸什么吗?

4

4 回答 4

4

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

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

于 2011-04-06T20:07:26.293 回答
2

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

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

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

于 2011-04-06T18:31:01.033 回答
2

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

于 2011-04-06T17:57:41.757 回答
0

您可以使用 Process.Start 的此重载来启动流程:

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

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

于 2017-04-18T19:40:17.023 回答