Я могу сделать:
using (var process = new Process()) {
process.StartInfo.FileName = executable;
process.StartInfo.Arguments = arguments;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
//process.StartInfo.Verb = "Open";
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
...
}
Но тогда мне нужно искать его ассоциацию (AssocQueryString
), анализировать строку ассоциации, которая может быть довольно сложной, например:
"%systemroot%\system32\mspaint.exe" /pt "%1" "%2" "%3" "%4"
Или:
C:\Python27\python.exe "%1" %*
Затем разделить на исполняемую часть, развернуть ее с помощью Environment.ExpandEnvironmentVariables(exeFile)
, затем заменить все проценты на проанализированные argmunets и т. Д.
В некоторых случаях строка ассоциации может быть очень странной, например (обратите внимание на все слэши - кто знает, работает ли она вообще ...):
\"C:\Program Files\Microsoft\R Client\R_SERVER\\\bin\\x64\\RGui.exe\" \"%1\"
Я могу использовать устаревшие WinExec
или ShellExecute
, но тогда я не могу перенаправить stdout / stderr.
Вызов CreateProcess
работает в основном как C # * new Process()
:MSDN заявляет, что
... Обратите внимание, что эта функция не выполняет поиск пути для каждого приложения, указанного в разделе реестра путей приложений.
Так что я обречен на этовсе работы самостоятельно?нет более простого решения?