Проблема в том, что по умолчанию для Process.StartInfo.UseShellExecute установлено значение true. Если для этой переменной задано значение true, а не запускать процесс самостоятельно, вы просите оболочку запустить его для вас. Это может быть очень полезно - это позволяет вам выполнять такие вещи, как «выполнение» HTML-файла (оболочка будет использовать соответствующее приложение по умолчанию).
Это не очень хорошо, когда вы хотите отслеживать приложение после его выполнения (как вы обнаружили), потому что запускающее приложение может иногда запутаться в том, какой экземпляр следует отслеживать.
Внутренние детали того, почему это происходит, вероятно, выходят за рамки моих возможностей ответить. Я знаю, что когда UseShellExecute == true, платформа использует Windows API ShellExecuteEx, а когда UseShellExecute == false, она использует CreateProcessWithLogonW, но почему один ведет к отслеживаемым процессам, а другой - не знаю, так как они оба возвращают идентификатор процесса.
РЕДАКТИРОВАТЬ: после небольшого копания:
Этот вопрос указал мне на флаг SEE_MASK_NOCLOSEPROCESS , который действительно, кажется, устанавливается при использовании ShellExecute. В документации по значению маски указано:
В некоторых случаях, например, когда выполнение выполняется через DDE
разговор, никакая ручка не будет возвращена. Приложение вызова
отвечает за закрытие ручки, когда она больше не нужна.
Таким образом, предполагается, что возвращение дескриптора процесса ненадежно. Я все еще не получил достаточно глубоко, чтобы знать, какой конкретный крайний случай вы можете затронуть здесь, хотя.