我在CentOS 5.5上运行一个简单的C#Mono 2.10应用程序,调用
Process.Start("/path/to/myapp/myapp.exe","-someArgs");
我可以使用
返回并运行进程IDmono --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
应用程序正确启动,没有任何异常,并按预期工作。
任何线索我搞砸了什么?
答案 0 :(得分:4)
文件/path/to/myapp/myapp.exe
是可执行文件(chmod +x /path/to/myapp/myapp.exe
)吗? Mono 2.10会检查它启动的进程是否是托管可执行文件,如果是,则会隐式使用当前正在执行的mono来启动新进程,例如Mono's CreateProcess source。 CreateProcess
包含所有细节,但其中包括:
如果Process.Start
仍无法启动您的流程,那么这是一个可能的单一错误,我们很乐意报告错误。 : - )
答案 1 :(得分:2)
尝试启动“mono”作为进程,并使用“/path/to/myapp/myapp.exe -someArgs”作为命令行参数。这将导致Process.Start的行为更像您正常的应用程序启动。
答案 2 :(得分:2)
问题是Linux本身并不知道它需要使用Mono来运行CIL .exe二进制文件,所以它尝试使用ld-linux.so作为加载器,这显然是因为失败。
您需要使用/path/to/myapp.exe作为arg调用mono。
FWIW,退出代码255只是“错误”。
答案 3 :(得分:0)
您可以使用Process.Start的重载启动进程:
Process.Start("/bin/bash", "-c \"echo 'Hello World!'\"");
不知道为什么,但它确实有效。