Как использовать Process.Start () или эквивалент с Mono на Mac и передать аргументы - PullRequest
24 голосов
/ 13 февраля 2010

Я пытаюсь написать код на c # для запуска браузера, используя Process.Start(app,args);, где apps - это путь к браузеру, например, /Applications/Google Chrome.app/Contents/MacOS/Google Chrome, а аргументы: --no-default-browser-check

Если я это сделаю, это работаетна Windows и на Linux

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

Я получаю

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.

Я также попытался Monobjc , чтобы попытаться запустить код с

// 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();

Но когда я запускаю свой код с помощью NUnit, это приводит к взрыву NUnit.

Я подозреваю, что это ошибка, но не могу доказать это.Я ценю любую помощь!

Ответы [ 4 ]

22 голосов
/ 17 февраля 2010

Чтобы Process.Start использовал exec напрямую, а не механизм ОС для открытия файлов, вы должны установить для UseShellExecute значение false. Это также верно для Linux и Windows.

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

Обратите внимание, что вы также можете использовать 'open' для вашего варианта использования, чтобы правильно запустить пакет приложений Chrome. Используйте аргумент '-a', чтобы заставить его запускать определенное приложение, аргумент '-n', чтобы открыть новый экземпляр, и '--args', чтобы передать аргументы:

Process.Start(new ProcessStartInfo (
    "open",
    "-a '/Applications/Google Chrome.app' -n --args --no-first-run")
    { UseShellExecute = false });
4 голосов
/ 13 февраля 2010

Похоже, Process использует для запуска утилиту командной строки open .

Вы должны избегать прямого вызова исполняемого файла. Если приложение уже запущено, оно будет запускать второй его экземпляр вместо активации уже запущенного экземпляра. Это, вероятно, не то, что вы хотите, и не все приложения могут справиться с этим в любом случае.

При открытом синтаксис для запуска Chrome будет

open -a Chrome

Я не знаю, как класс Process работает в MacOS X, но я предполагаю, что параметры должны быть похожими.

Обратите внимание: если вы просто хотите открыть веб-страницу, вам не следует указывать исполняемый файл; вместо этого просто передайте URL, чтобы он открывался в браузере пользователя по умолчанию. Это действительно для любой платформы.

Process.Start("http://www.google.com");
1 голос
/ 13 февраля 2010

Вы пробовали что-то вроде объединения параметров в имя процесса вместо передачи его отдельно?

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 голосов
/ 13 февраля 2010

Почему бы вам не попробовать что-то вроде этого:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...