Если вы посмотрите на опорный источник, вы увидите, как Process.Start
работы:
http://referencesource.microsoft.com/System/R/c50d8ac0eb7bc0d6.html
Это один из двух методов, называемых при вызове Process.Start
. Обратите внимание на нижнюю часть, где оно возвращает значение true или false. False возвращается только в том случае, если после запуска процесса он не может получить дескриптор процесса, который был запущен.
Для того, чтобы начать процесс, он использует NativeMethods.CreateProcess
, которые вы можете найти источник здесь: http://referencesource.microsoft.com/System/compmod/microsoft/win32/NativeMethods.cs.html#9c52a5ca5f3eeea3
который является только метод прототипа для Kernel32.CreateProcess
, которого API находится здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx
Если вы смотрите на возвращаемые значения, он говорит:
Если функция выполнена успешно, возвращаемое значение отличное от нуля. Если функция не работает, возвращаемое значение равно нулю.
Я не могу найти ничего в API для CreateProcess
, что говорит, что это не работает, если запрашиваемый процесс уже запущен, возможно, если процесс не удалось запустить, поскольку это единственное приложение экземпляра (например, Outlook), то он может fail, но для приложений с несколькими экземплярами, таких как командная строка, он не должен создавать дескриптор процесса.
Итак, после того, как все говорят, что, возможно, что в документации MSDN это не совсем правильно, у меня нет ссылки у вас есть, но для Process.Start(StartInfo)
, MSDN говорит это о возвращаемом значении:
Новый процесс, связанный с ресурсом процесса, или null, если не запущен ресурс процесса. Обратите внимание, что новый процесс, который запускается рядом с уже запущенными экземплярами одного и того же процесса, будет независимым от других. Кроме того, Start может возвращать ненулевой процесс с свойством HasExited, уже установленным в true. В этом случае запущенный процесс может активировать существующий экземпляр самого себя, а затем выйти.
(Акцент, добавленный мной). Он не говорит, что вызов завершится неудачно, если он уже запущен.
Для Process.Start()
, он говорит:
Возвращаемое значение Тип: System.Boolean верно, если запущен ресурс процесса; false, если новый ресурс процесса не запущен (например, если существующий процесс используется повторно).
Так говорит если существующий процесс повторно, это полностью зависит от приложения при старте или способа его запуска.
Возможный дубликат [Process.Start и выделенные ресурсы] (http://stackoverflow.com/questions/10884136/process-start-and-allocated-resources) – Sinatr
FWIW, В зависимости от того, используете ли вы Shell Execute для начните процесс, вот фактический код, который его определяет: [Без выполнения оболочки] (http://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/Process.cs,2167), [С помощью Shell Execute ] (http://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/Process.cs,2278). –