Mono Process.Start возвращает ExitCode 255?

У меня есть простое приложение C # Mono 2.10, работающее на CentOS 5.5, которое вызывает

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

Я могу вернуть идентификатор процесса и запустить его с

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 

Приложение запускается корректно без каких-либо исключений и работает как положено.

Любая подсказка, что я облажался?


person Brad Cunningham    schedule 06.04.2011    source источник


Ответы (4)


Является ли файл /path/to/myapp/myapp.exe исполняемым файлом (chmod +x /path/to/myapp/myapp.exe)? Mono 2.10 действительно проверяет, является ли процесс, который он запускает, управляемым исполняемым файлом, и если да, то будет неявно использовать текущий исполняемый файл mono для запуска нового процесса, например Источник CreateProcess в Mono. CreateProcess содержит все подробности, но среди них:

Если Process.Start по-прежнему не удается запустить процесс, то это вероятная монофоническая ошибка, и мы хотели бы сообщить об ошибке для нее. :-)

person jonp    schedule 06.04.2011
comment
хорошо, так что вы выиграли с новым ответом за окончательное объяснение. Если я ls -l в моем exe, разрешения будут такими -rwxr-xr-x - person Brad Cunningham; 07.04.2011
comment
Таким образом, даже после принудительного использования chmod + x для myexe (что уже было) он по-прежнему не может запустить мой процесс. Значит, ошибка в моно? - person Brad Cunningham; 07.04.2011

Попробуйте запустить «mono» в качестве процесса и используйте «/path/to/myapp/myapp.exe -someArgs» в качестве аргументов командной строки. Это приведет к тому, что Process.Start будет вести себя как обычный запуск приложения.

person Reed Copsey    schedule 06.04.2011
comment
Я подумал о том, чтобы попробовать это. Позволь мне посмотреть, что происходит - person Brad Cunningham; 06.04.2011
comment
Замечательно, проблема устранилась. Имеет смысл, приложение, которое я запускаю, моно, а не myapp.exe, спасибо - person Brad Cunningham; 06.04.2011
comment
В этом нет необходимости, поскольку моно CreateProcess () явно проверяет наличие управляемых исполняемых файлов и неявно использует тот же mono для их запуска. Является ли /path/to/myapp/myapp.exe исполняемым файлом (chmod +x)? См. Также: github.com/mono/mono /blob/master/mono/io-layer/processes.c#L812 - person jonp; 07.04.2011

Проблема в том, что сам Linux не знает, что ему нужно использовать Mono для запуска двоичных файлов CIL .exe, поэтому он пытается использовать ld-linux.so в качестве загрузчика, что по очевидным причинам терпит неудачу.

Вам нужно вызвать моно с /path/to/myapp.exe в качестве аргумента.

FWIW, код выхода 255 - это просто «ошибка».

person jstedfast    schedule 06.04.2011
comment
Я решил, что 255 бесполезно, спасибо за информацию. Рид опередил вас на несколько минут, но оба ответа верны. Спасибо - person Brad Cunningham; 06.04.2011

Вы можете запустить процесс, используя эту перегрузку Process.Start:

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

Не знаю почему, но работает.

person Alex Erygin    schedule 18.04.2017