2013-03-16 11 views
5

Sto utilizzando correttamente System.Diagnostics.Process.Start() per avviare il mio eseguibile mono esterno su Windows. Tuttavia fallisce su mac. Non ho alcun errore, semplicemente non succede nulla.Avvia un processo esterno su mac con C#

Ho provato a farlo nel modo seguente:

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

Inoltre ho provato ad aprire terminale come il seguente (che anche non):

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

L'unica cosa che ho potuto fare si avvia il Terminale nel modo seguente:

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

Qualche idea? Gradirei davvero qualsiasi aiuto.

Grazie!

+0

Vedere la risposta ... –

+0

@ konrad.kruczynski Questo non funziona per me. In realtà ho persino provato a lanciare l'attuale eseguibile mono in "/Libraries/Frameworks/Mono.framework/Versions/2.*/bin/mono". Il file è presente, tuttavia chiamare System.Diagnostics.Process.Start non fa nulla. L'unica cosa che ho potuto avviare con Process.Start era "open -a Terminal". –

+0

funziona bene per me, suppongo che sia un bug allora (o una vecchia versione mono o qualcosa del genere). Non esitate a creare una segnalazione di bug qui: http://bit.ly/qFa0pT –

risposta

9

Quello che devi fare è utilizzare il percorso completo del file eseguibile attuale. Su OSX, le "app" sono in realtà cartelle appositamente strutturate con un'estensione .app e l'eseguibile (di solito) vive sotto Content/MacOS/[name].

Ad esempio, per aprire Terminal:

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

O per TextEdit:

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

Per individuare il file eseguibile, è possibile fare clic destro (o Control-clic) un app, e selezionare Mostra il contenuto della confezione e aprirà la cartella attuale in Finder. È quindi possibile navigare nella cartella Contents/MacOS per trovare l'eseguibile effettivo.

Per eseguire gli eseguibili Mono, è necessario utilizzare il percorso completo dell'eseguibile mono e passare il programma come argomento. Di solito sarà qualcosa come /usr/local/bin/mono o forse /usr/bin/mono.

Ad esempio:

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

Ovviamente devi usare il percorso effettivo al file .exe, quanto sopra è solo un esempio.

0

Per espandere su Bryan risposta, si prega di non mi hardcode il percorso /usr/bin/local/ nel codice.

Per scoprire il percorso corretto in ogni sistema, ci sono varie tecniche, ma non sono sicuro che è il migliore:

  • Usa which mono per individuare il percorso completo. Per questo è necessario chiamare which da un'altra istanza di processo. (Non sono sicuro che l'impostazione which sia predefinita in tutti i sistemi Mac)
  • Utilizzare pkg-config per determinare il prefisso dove è installato Mono. Ma attenzione, non puoi semplicemente chiamare pkg-config del sistema, devi prima controllare se esiste pkg-config di mono. Per questo, è necessario verificare se questo percorso hardcoded esiste: /Library/Frameworks/Mono.framework/Versions/Current/bin/pkg-config (come se fosse fatto here).
+0

Su OS X, dovrebbe essere effettivamente /Libraries/Frameworks/Mono.framework/Versions/Current/bin/mono - btw. IMHO, invece di postare una risposta separata, dovresti proporre una modifica per cose come questa, dove stai solo aggiungendo cose a una risposta esistente. –

+0

Martin, questo è solo se hai usato l'installer ufficiale, ma potresti non averlo ... – knocte

+0

Questo è un buon punto. Suggerisco caldamente l'approccio 'which mono' se si tratta di un'applicazione utente. Se si tratta di un lato server, è possibile che si desideri impostare il percorso su mono come impostazione di configurazione. – rossipedia

0

La caratteristica poco nota di Mono è che è possibile eseguire direttamente il file .exe (per essere compatibile con il modo in cui è fatto in Windows, ma anche per comodità). Viene avviato utilizzando la stessa Mono VM che ha avviato l'eseguibile originale. In altre parole, si può semplicemente fare:

Process.Start("Test.exe"); 

Beh, almeno per me funziona su Linux;)

Edit:

Ecco il source per tale funzione, dovrebbe funzionare su tutti i piattaforma.

+0

Una nota importante: il file EXE di destinazione richiede un bit di bit eseguibile, o Mono rifiuterà il lancio di quel programma. – LubosD