2010-02-12 4 views
23

Ich versuche, einige C# -Code zu schreiben, um einen Browser zu starten mit Process.Start(app,args); wo Apps ist der Pfad zum Browser z. /Applications/Google Chrome.app/Contents/MacOS/Google Chrome und die args sind --no-default-browser-checkWie zu verwenden Process.Start() oder gleichwertig mit Mono auf einem Mac und Argumente übergeben

Wenn ich tun, die unter Windows und auf Linux

ich

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. 

Ich habe auch versucht, Monobjc zu versuchen, führen Sie den Code mit

arbeitet

Process.Start("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","--no-first-run"); 
// 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(); 

Aber wenn ich meinen Code mit NUnit es laufen verursacht NUnit zu explodieren.

Ich vermute, dass dies ein Fehler ist, kann es aber nicht beweisen. Ich schätze jede Hilfe! so etwas wie dieses

+0

Hat laufen diesen Befehl aus eine Befehlszeile arbeiten? – nos

+0

Ja, es funktioniert. Von dem was ich sehen kann, sollte Process.Start() exec verwenden, um die App zu starten, anstatt – AutomatedTester

+0

zu öffnen. Was ist mit dem Erstellen eines Skripts, das Chrome mit der gewünschten Befehlszeile ausführt und dieses Skript über Mono ausführt? – unknownuser

Antwort

21

Um Process.Start Verwendung exec direkt anstelle der Verwendung des O‘Mechanismus zum Öffnen von Dateien zu machen, müssen Sie UseShellExecute auf false gesetzt. Dies gilt auch für Linux und Windows.

Beachten Sie, dass Sie auch "Öffnen" für Ihren Anwendungsfall verwenden können, um das Chrome-App-Bundle ordnungsgemäß auszuführen. Verwenden Sie das ‚-a‘ Argument, es zu zwingen, eine bestimmte App zu laufen, die ‚-n‘ Argument eine neue Instanz zu öffnen und ‚--args‘ in Argumenten zu übergeben:

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

Ich wusste nicht über die UseShellExecute! vielen Dank! – AutomatedTester

1

Warum versuchen Sie nicht:

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

leider ergibt sich das gleiche, was ich früher gesehen habe.Danke, dass Sie es versuchen – AutomatedTester

1

Haben Sie so etwas wie verketten die Parameter in den Prozessnamen versucht, anstatt sie getrennt von passing?

 
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

versucht, dass aber beim Starten es die Argumente repassiniert und immer noch das gleiche Problem zeigt. – AutomatedTester

4

Sieht aus wie Process verwendet das open Kommandozeilen-Programm zu starten.

Sie sollten vermeiden, die ausführbare Datei direkt aufzurufen. Wenn die Anwendung bereits ausgeführt wird, würde dies eine zweite Instanz davon starten, anstatt die bereits laufende Instanz zu aktivieren. Das ist wahrscheinlich nicht das, was Sie wollen, und nicht alle Anwendungen können das trotzdem verarbeiten.

Mit offenem, die Syntax zu starten Chrome

open -a Chrome 

Ich weiß nicht, würde, wie die Process-Klasse auf MacOS X funktioniert, aber ich nehme an, dass die Parameter ähnlich sein sollten.

Hinweis: Wenn Sie nur eine Webseite öffnen möchten, sollten Sie die ausführbare Datei nicht angeben. Übergeben Sie stattdessen einfach die URL, sodass sie im Standardbrowser des Benutzers geöffnet wird. Dies gilt für jede Plattform.

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

Leider muss ich ein Argument übergeben, weil ich Chrome mit einer Erweiterung laden muss. Chrome lädt nur Erweiterungen, wenn Sie diese beim Starten des Browsers mit den Argumenten angeben. – AutomatedTester

Verwandte Themen