コード例 #1
0
        public static Process ExecuteBlocking(
            IFile exeFile,
            params string[] args)
        {
            var processSetup = new ProcessSetup(exeFile, args)
            {
                Method = ProcessExecutionMethod.BLOCK,
            };

            return(ProcessUtil.Execute(processSetup));
        }
コード例 #2
0
        public ReactivityDataCollector()
        {
            var profilersLocation =
                Path.Combine(
                    Path.GetDirectoryName(
                        new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath),
                    "profiler");

            mProcessSetup = new ProcessSetup(profilersLocation)
            {
                WaitForConnection   = true,
                MonitorAllFromStart = true
            };
        }
コード例 #3
0
        public virtual int SetupProcessing(ref ProcessSetup setup)
        {
            System.Diagnostics.Trace.WriteLine("IAudioProcessor.SetupProcessing");

            if (this.IsActive)
            {
                return(TResult.E_Unexpected);
            }
            if (!TResult.IsTrue(CanProcessSampleSize(setup.SymbolicSampleSize)))
            {
                return(TResult.S_False);
            }

            this.MaxSamplesPerBlock = setup.MaxSamplesPerBlock;
            this.ProcessMode        = setup.ProcessMode;
            this.SampleRate         = setup.SampleRate;
            this.SampleSize         = setup.SymbolicSampleSize;

            return(TResult.S_True);
        }
コード例 #4
0
        public async Task Launch(LaunchInfo launchInfo, CancellationToken cancellationToken)
        {
            var psi = new ProcessStartInfo();

            psi.FileName  = launchInfo.FileName;
            psi.Arguments = launchInfo.Arguments;

            psi.UseShellExecute = false;

            var processSetup = new ProcessSetup(mProfilersLocation);

            if (launchInfo.Options.HasFlag(LaunchOptions.MonitorAllFromStart))
            {
                processSetup.MonitorAllFromStart = true;
                processSetup.WaitForConnection   = true;
            }
            processSetup.SetEnvironmentVariables(psi);

            Process process;

            try
            {
                process = Process.Start(psi);
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Failed to start process: {ex.Message}", ex);
            }

            if (process == null)
            {
                throw new ConnectionException("Process failed to start.");
            }

            var server = new Server(process.Id, process.ProcessName, processSetup.PipeName);

            await Open(server, cancellationToken).ConfigureAwait(false);
        }
コード例 #5
0
        public static Process Execute(ProcessSetup processSetup)
        {
            var exeFile = processSetup.ExeFile;

            Asserts.True(
                exeFile.Exists,
                $"Attempted to execute a program that doesn't exist: {exeFile}");

            var args      = processSetup.Args;
            var argString = "";

            for (var i = 0; i < args.Length; ++i)
            {
                // TODO: Is this safe?
                var arg = args[i];

                if (i > 0)
                {
                    argString += " ";
                }
                argString += arg;
            }

            var processStartInfo =
                new ProcessStartInfo($"\"{exeFile.FullName}\"", argString)
            {
                CreateNoWindow         = true,
                RedirectStandardOutput = true,
                RedirectStandardError  = true,
                RedirectStandardInput  = true,
                UseShellExecute        = false,
            };

            var process = Asserts.CastNonnull(Process.Start(processStartInfo));

            ChildProcessTracker.AddProcess(process);

            var logger = Logging.Create(exeFile.FullName);

            if (processSetup.WithLogging)
            {
                process.OutputDataReceived += (_, args) => {
                    if (args.Data != null)
                    {
                        logger !.LogInformation("  " + args.Data);
                    }
                };
                process.ErrorDataReceived += (_, args) => {
                    if (args.Data != null)
                    {
                        logger !.LogError("  " + args.Data);
                    }
                };
            }
            else
            {
                process.OutputDataReceived += (_, _) => {};
                process.ErrorDataReceived  += (_, _) => {};
            }

            process.BeginOutputReadLine();
            process.BeginErrorReadLine();

            switch (processSetup.Method)
            {
            case ProcessExecutionMethod.MANUAL: {
                break;
            }

            case ProcessExecutionMethod.BLOCK: {
                process.WaitForExit();
                break;
            }

            default:
                throw new NotImplementedException();
            }

            // TODO: https://stackoverflow.com/questions/139593/processstartinfo-hanging-on-waitforexit-why

            /*
             * using var outputWaitHandle = new AutoResetEvent(false);
             * using var errorWaitHandle = new AutoResetEvent(false);
             *
             * process.OutputDataReceived += (sender, e) => {
             * if (e.Data == null) {
             *  // ReSharper disable once AccessToDisposedClosure
             *  outputWaitHandle.Set();
             * } else {
             *  logger.LogInformation(e.Data);
             * }
             * };
             * process.ErrorDataReceived += (sender, e) => {
             * if (e.Data == null) {
             *  // ReSharper disable once AccessToDisposedClosure
             *  errorWaitHandle.Set();
             * } else {
             *  logger.LogError(e.Data);
             * }
             * };
             *
             * process.Start();
             *
             * process.BeginOutputReadLine();
             * process.BeginErrorReadLine();
             *
             * // TODO: Allow passing in timeouts
             * if (outputWaitHandle.WaitOne() &&
             *  errorWaitHandle.WaitOne()) {
             * process.WaitForExit();
             * // Process completed. Check process.ExitCode here.
             * } else {
             * // Timed out.
             * }*/

            return(process);
        }