В зависимости от того, насколько точно выполнение останавливается в строке proc.ExitCode, может случиться, что процесс не будет завершен к моменту доступа к свойству ExitCode, и затем он выдаст исключение InvalidOperationException.
В этом случае вы можете проверить, завершился ли процесс с помощью proc.HasExited, прежде чем пытаться получить доступ к свойству ExitCode