2013-03-16 16 views
5

Z powodzeniem używam System.Diagnostics.Process.Start(), aby uruchomić mój zewnętrzny plik wykonywalny mono w systemie Windows. Jednak zawiedzie w mac. Nie dostaję żadnego błędu, po prostu nic się nie dzieje.Rozpocznij proces zewnętrzny na komputerze Mac za pomocą C#

Próbowałem robić to w następujący sposób:

System.Diagnostics.Process.Start("mono", "/path/program.exe"); 

także próbowałam otwarcie terminala jak poniżej (które również nie):

System.Diagnostics.Process.Start("Terminal"); 

Jedyną rzeczą, jaką był w stanie zrobić uruchamia Terminal w następujący sposób:

System.Diagnostics.Process.Start("open", "-a Terminal"); 

Jakieś pomysły? Naprawdę doceniłbym każdą pomoc.

Dzięki!

+0

Zobacz moją odpowiedź ... –

+0

@ konrad.kruczynski To nie działa dla mnie. Właściwie to nawet próbowałem uruchomić rzeczywisty plik wykonywalny mono w "/ Libraries/Frames/Mono.framework/Versions/2.*/bin/mono". Plik jest tam obecny, jednak wywołanie System.Diagnostics.Process.Start na nim nic nie robi. Jedyną rzeczą, którą udało mi się uruchomić z Process.Start było "open -a Terminal". –

+0

to działa dobrze dla mnie, domyślam się, że to błąd (lub stara wersja Mono lub coś podobnego). Nie wahaj się utworzyć raport o błędzie tutaj: http://bit.ly/qFa0pT –

Odpowiedz

9

To, co musisz zrobić, to użyć pełnej ścieżki do rzeczywistego pliku wykonywalnego. W systemie OSX "aplikacje" to w rzeczywistości specjalnie uporządkowane foldery z rozszerzeniem .app, a plik wykonywalny (zwykle) znajduje się pod Content/MacOS/[name].

Na przykład, aby otworzyć Terminal:

System.Diagnosticts.Process.Start("/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal"); 

Or dla TextEdit:

System.Diagnostics.Process.Start("/Applications/TextEdit.app/Contents/MacOS/TextEdit"); 

Aby zlokalizować plik wykonywalny, można kliknąć prawym przyciskiem myszy (lub z naciśniętym klawiszem Control) aplikacja, a następnie wybierz Pokaż zawartość opakowania, która otworzy folder w Finderze. Następnie możesz przejść do folderu Contents/MacOS, aby znaleźć rzeczywisty plik wykonywalny.

Aby uruchomić pliki wykonywalne Mono, należy użyć pełnej ścieżki do pliku wykonywalnego mono i przekazać program jako argument. Zwykle będzie to coś w stylu: /usr/local/bin/mono lub prawdopodobnie /usr/bin/mono.

Na przykład:

System.Diagnostics.Process.Start("/usr/bin/local/mono /Users/Ilya/Projects/SomeApp.exe"); 

Oczywiście byłoby użyć rzeczywistą ścieżkę do pliku .exe, powyższe jest tylko przykładem.

0

Aby rozwinąć na Bryan odpowiedź, proszę nie hardcode ścieżkę /usr/bin/local/ w kodzie.

Aby dowiedzieć się prawidłową ścieżkę w każdym systemie, istnieją różne techniki, ale nie jestem pewien, który jest najlepszy:

  • Zastosowanie which mono zlokalizować pełną ścieżkę. W tym celu należy wywołać which z innej instancji procesu. (Nie jestem pewien, czy domyślnie which jest we wszystkich systemach Mac).
  • Użyj pkg-config, aby ustalić prefiks, w którym zainstalowany jest Mono. Ale uwaga, nie możesz po prostu wywołać pkg-config systemu, musisz najpierw sprawdzić, czy istnieje monopod pkg-config. W tym celu należy sprawdzić, czy istnieje ta stała na sztywno: /Library/Frameworks/Mono.framework/Versions/Current/bin/pkg-config (podobnie jak w przypadku here).
+0

Na OS X powinien to być /Libraries/Frameworks/Mono.framework/Versions/Current/bin/mono - btw. IMHO, zamiast publikować osobną odpowiedź, powinieneś zaproponować edycję takich rzeczy, w których dodajesz tylko rzeczy do istniejącej odpowiedzi. –

+0

Martin, to tylko jeśli użyłeś oficjalnego instalatora, ale możesz nie mieć ... – knocte

+0

To jest dobra uwaga. Zdecydowanie sugerowałbym podejście "które mono", jeśli jest to aplikacja użytkownika. Jeśli jest to serwer po stronie serwera, możesz ustawić ścieżkę do mono jako ustawienie konfiguracyjne. – rossipedia

0

Mało znaną cechą Mono jest to, że można bezpośrednio uruchomić plik .exe (aby był kompatybilny z tym, jak to się robi w Windows, ale także dla wygody). Jest on uruchamiany przy użyciu tej samej maszyny wirtualnej Mono, która uruchomiła oryginalny plik wykonywalny. Innymi słowy można po prostu zrobić:

Process.Start("Test.exe"); 

Cóż, przynajmniej u mnie działa na Linux;)

Edit:

Oto source dla tej funkcji, powinien działać na każdym Platforma.

+0

Jedna ważna uwaga: docelowy plik EXE wymaga zestawu bitów wykonywalnych, lub Mono odmówi uruchomienia tego programu. – LubosD