Подтвердить что ты не робот

Как использовать Process.Start() или эквивалент с Mono на Mac и передать аргументы

Я пытаюсь написать код С# для запуска браузера с помощью Process.Start(app,args);, где приложения - это путь к браузеру, например. /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 взорваться.

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

4b9b3361

Ответ 1

Чтобы заставить Process.Start использовать exec напрямую, вместо использования механизма OS для открытия файлов, вы должны установить 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 });

Ответ 2

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

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

С открытым, синтаксис запуска Chrome будет

open -a Chrome

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

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

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

Ответ 3

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

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

Ответ 4

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

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