| File: System\CodeDom\Compiler\Executor.cs | Web Access |
| Project: src\runtime\src\libraries\System.CodeDom\src\System.CodeDom.csproj (System.CodeDom) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; using System.Text; namespace System.CodeDom.Compiler { public static class Executor { private const int ProcessTimeOut = 600000; private static FileStream CreateInheritedFile(string file) => new FileStream(file, FileMode.CreateNew, FileAccess.Write, FileShare.Read | FileShare.Inheritable); public static void ExecWait(string cmd, TempFileCollection tempFiles) { string outputName = null, errorName = null; ExecWaitWithCapture(cmd, tempFiles, ref outputName, ref errorName); } public static int ExecWaitWithCapture(IntPtr userToken, string cmd, TempFileCollection tempFiles, ref string outputName, ref string errorName) => ExecWaitWithCapture(userToken, cmd, Environment.CurrentDirectory, tempFiles, ref outputName, ref errorName); public static int ExecWaitWithCapture(string cmd, string currentDir, TempFileCollection tempFiles, ref string outputName, ref string errorName) => ExecWaitWithCapture(IntPtr.Zero, cmd, currentDir, tempFiles, ref outputName, ref errorName); public static int ExecWaitWithCapture(string cmd, TempFileCollection tempFiles, ref string outputName, ref string errorName) => ExecWaitWithCapture(IntPtr.Zero, cmd, Environment.CurrentDirectory, tempFiles, ref outputName, ref errorName); public static int ExecWaitWithCapture(IntPtr userToken, string cmd, string currentDir, TempFileCollection tempFiles, ref string outputName, ref string errorName) { if (userToken != IntPtr.Zero) { throw new PlatformNotSupportedException(); } if (string.IsNullOrEmpty(outputName)) { outputName = tempFiles.AddExtension("out"); } if (string.IsNullOrEmpty(errorName)) { errorName = tempFiles.AddExtension("err"); } using (var outputWriter = new StreamWriter(CreateInheritedFile(outputName), Encoding.UTF8)) using (var errorWriter = new StreamWriter(CreateInheritedFile(errorName), Encoding.UTF8)) { // Output the command line... outputWriter.Write(currentDir); outputWriter.Write("> "); outputWriter.WriteLine(cmd); outputWriter.WriteLine(); outputWriter.WriteLine(); var psi = new ProcessStartInfo(cmd) { WorkingDirectory = currentDir, RedirectStandardOutput = true, RedirectStandardError = true }; using (Process p = Process.Start(psi)) { p.OutputDataReceived += (s, e) => { if (e.Data != null) { outputWriter.WriteLine(e.Data); } }; p.ErrorDataReceived += (s, e) => { if (e.Data != null) { errorWriter.WriteLine(e.Data); } }; p.BeginOutputReadLine(); p.BeginErrorReadLine(); if (!p.WaitForExit(ProcessTimeOut)) { const int WAIT_TIMEOUT = 0x102; throw new ExternalException(SR.Format(SR.ExecTimeout, cmd), WAIT_TIMEOUT); } p.WaitForExit(); return p.ExitCode; } } } } }