2010-02-12 6 views
23

Sto provando a scrivere un codice C# per avviare un browser utilizzando Process.Start(app,args); dove app è il percorso del browser, ad es. /Applications/Google Chrome.app/Contents/MacOS/Google Chrome e args sono --no-default-browser-checkCome utilizzare Process.Start() o equivalente con Mono su Mac e passare argomenti

se lo faccio, che funziona su Windows e su Linux

Process.Start("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","--no-first-run"); 

ottengo

open: unrecognized option `--no-first-run' 
Usage: open [-e] [-t] [-f] [-W] [-n] [-g] [-h] [-b <bundle identifier>] [-a <application>] [filenames] 
Help: Open opens files from a shell. 
     By default, opens each file using the default application for that file. 
     If the file is in the form of a URL, the file will be opened as a URL. 
Options: 
     -a    Opens with the specified application. 
     -b    Opens with the specified application bundle identifier. 
     -e    Opens with TextEdit. 
     -t    Opens with default text editor. 
     -f    Reads input from standard input and opens with TextEdit. 
     -W, --wait-apps Blocks until the used applications are closed (even if they were already running). 
     -n, --new   Open a new instance of the application even if one is already running. 
     -g, --background Does not bring the application to the foreground. 
     -h, --header  Searches header file locations for headers matching the given filenames, and opens them. 

Ho anche cercato Monobjc provare eseguire il codice con

// spin up the objective-c runtime 
ObjectiveCRuntime.LoadFramework("Cocoa"); 
ObjectiveCRuntime.Initialize(); 
NSAutoreleasePool pool = new NSAutoreleasePool(); 

// Create our process 
NSTask task = new NSTask(); 
NSPipe standardOut = new NSPipe(); 
task.StandardOutput = standardOut; 
task.LaunchPath = @"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"; 

// add some arguments 
NSString argumentString = new NSString("--no-first-run"); 
NSArray arguments = NSArray.ArrayWithObject(argumentString); 
task.Arguments = arguments; 

// We should have liftoff 
task.Launch(); 


// Parse the output and display it to the console 
NSData output = standardOut.FileHandleForReading.ReadDataToEndOfFile; 
NSString outString = new NSString(output,NSStringEncoding.NSUTF8StringEncoding); 
Console.WriteLine(outString); 

// Dipose our objects, gotta love reference counting 
pool.Release(); 

Ma quando eseguo il mio codice utilizzando NUnit fa esplodere NUnit.

Ho il sospetto che si tratti di un errore ma non posso provarlo. Apprezzo qualsiasi aiuto!

+0

Vuol correre che comando funziona una riga di comando? – nos

+0

Sì, funziona. Da quello che posso vedere Process.Start() dovrebbe usare exec per eseguire l'app piuttosto che aprire – AutomatedTester

+0

Che ne dici di creare uno script che esegua Chrome con la riga di comando desiderata ed eseguirlo tramite Mono? – unknownuser

risposta

21

Per usufruire Process.Start exec direttamente invece di utilizzare il meccanismo di OS' per aprire i file, è necessario impostare UseShellExecute su false. Questo vale anche per Linux e Windows.

Process.Start(new ProcessStartInfo (
    "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", 
    "--no-first-run") 
    { UseShellExecute = false }); 

Si noti che è anche possibile utilizzare "Apri" per la propria custodia, per eseguire correttamente il pacchetto di app di Chrome. Utilizzare l'argomento '-a' per costringerlo a eseguire un'applicazione specifica, l'argomento '-n' per aprire una nuova istanza, e '--args' a passare in argomenti:

Process.Start(new ProcessStartInfo (
    "open", 
    "-a '/Applications/Google Chrome.app' -n --args --no-first-run") 
    { UseShellExecute = false }); 
+0

Non mi ero reso conto di UseShellExecute! grazie mille! – AutomatedTester

1

Perchè non provare qualcosa di simile:

Process P = new Process();       
P.StartInfo.FileName = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"; 
P.StartInfo.Arguments = "--no-default-browser-check"; 
P.UseShellExecute = false;    
P.Start(); 
+1

sfortunatamente ciò risulta nella stessa cosa che vedevo prima.Grazie per averci provato, lo ha provato – AutomatedTester

1

Hai provato qualcosa di simile concatenando i parametri nel nome del processo, invece di passarlo separati?

 
var processName = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"; 
var args = "--no-default-browser-check"; 
Process.Start(String.Format("{0} {1}", processName, args)); 
+0

, ma quando lo si avvia ricongina gli argomenti e mostra ancora lo stesso problema. – AutomatedTester

4

Sembra Process utilizza l'utilità della riga di comando per lanciare open.

È consigliabile evitare di chiamare direttamente l'eseguibile. Se l'applicazione è già in esecuzione, verrà avviata una seconda istanza anziché attivare l'istanza già in esecuzione. Probabilmente non è quello che vuoi, e non tutte le applicazioni possono gestirlo comunque.

Con aperto, la sintassi per lanciare Chrome sarebbe

open -a Chrome 

non so come la classe processo funziona su MacOS X, ma suppongo che i parametri dovrebbero essere simili.

Nota: se si desidera solo aprire una pagina Web, non specificare l'eseguibile; invece, basta passare l'URL, in modo che venga aperto nel browser predefinito dell'utente. Questo è valido per qualsiasi piattaforma.

Process.Start("http://www.google.com"); 
+0

sfortunatamente ho bisogno di passare un argomento perché devo caricare Chrome con un'estensione. Chrome carica le estensioni solo se le specifichi con gli argomenti all'avvio del browser. – AutomatedTester