2010-02-12 11 views
23

Estoy tratando de escribir algún código C# para iniciar un navegador usando Process.Start(app,args); donde las aplicaciones son la ruta al navegador, p. /Applications/Google Chrome.app/Contents/MacOS/Google Chrome y los argumentos son --no-default-browser-checkCómo usar Process.Start() o equivalente con Mono en una Mac y pasar los argumentos

si lo hago, que funciona en Windows y en Linux

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

me sale

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. 

también he intentado Monobjc intentar ejecutar el código 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(); 

Pero cuando ejecuto mi código usando NUnit hace que NUnit explote.

Sospecho que esto es un error pero no lo puedo probar. ¡Agradezco cualquier ayuda!

+0

¿Se ejecuta ese comando desde una línea de comando funciona? – nos

+0

Sí, funciona. De lo que puedo ver, Process.Start() debería usar exec para ejecutar la aplicación en lugar de abrir – AutomatedTester

+0

¿Qué tal crear un script que ejecute Chrome con la línea de comandos deseada y ejecutar ese script a través de Mono? – unknownuser

Respuesta

21

Para hacer uso Process.Start Exec directamente en lugar de utilizar el mecanismo del sistema operativo' para abrir archivos, debe establecer UseShellExecute a falso. Esto también es cierto en Linux y Windows.

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

Tenga en cuenta que también se puede utilizar 'abierta' para su caso de uso, para ejecutar el paquete de aplicaciones de Chrome correctamente. Utilice el argumento '-a' para obligar a que se ejecute una aplicación específica, el argumento '-n' para abrir una nueva instancia, y '--args' para pasar de argumentos:

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

¡No me di cuenta del UseShellExecute! ¡muchas gracias! – AutomatedTester

1

¿Por qué no intentar algo como esto:

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

desafortunadamente eso resulta en lo mismo que antes.Gracias por probarlo, – AutomatedTester

1

Ha intentado algo así como la concatenación de los parámetros en el nombre del proceso en lugar de pasarlo separados?

 
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

lo intenté, pero al iniciarlo recongina los argumentos y aún muestra el mismo problema. – AutomatedTester

4

Parece que Process utiliza la utilidad de línea de comandos para iniciar open.

Debe evitar llamar directamente al ejecutable. Si la aplicación ya se está ejecutando, esto lanzaría una segunda instancia de la misma en lugar de activar la instancia en ejecución. Probablemente eso no es lo que quieres, y no todas las aplicaciones pueden manejar esto de todos modos.

Con abierta, la sintaxis para lanzar Chrome sería

open -a Chrome 

No sé cómo la clase de proceso funciona en MacOS X, pero supongo que los parámetros deben ser similares.

Nota, si solo desea abrir una página web, no debe especificar el ejecutable; en su lugar, simplemente pase la URL, para que se abra en el navegador predeterminado del usuario. Esto es válido para cualquier plataforma.

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

desafortunadamente necesito pasar un argumento porque necesito cargar Chrome con una extensión. Chrome solo carga extensiones si las especifica con los argumentos al iniciar el navegador. – AutomatedTester

Cuestiones relacionadas