private int DoCompilation (string compilerName, string responseFileName, TempFileCollection tf, string working_dir, ExecutionEnvironment envVars, ref string output) { StringWriter outwr = new StringWriter (); try { ProcessStartInfo pinfo = new ProcessStartInfo (compilerName, "\"@" + responseFileName + "\""); pinfo.WorkingDirectory = working_dir; envVars.MergeTo (pinfo); pinfo.UseShellExecute = false; pinfo.RedirectStandardOutput = true; pinfo.RedirectStandardError = true; ProcessWrapper pw = Runtime.ProcessService.StartProcess (pinfo, outwr, outwr, null); pw.WaitForOutput (); output = outwr.ToString (); return pw.ExitCode; } finally { if (outwr != null) outwr.Dispose (); } }
static int DoCompilation (string compilerName, string compilerArgs, string working_dir, ExecutionEnvironment envVars, List<string> gacRoots, ref string output, ref string error) { output = Path.GetTempFileName(); error = Path.GetTempFileName(); StreamWriter outwr = new StreamWriter (output); StreamWriter errwr = new StreamWriter (error); ProcessStartInfo pinfo = new ProcessStartInfo (compilerName, compilerArgs); pinfo.StandardErrorEncoding = Encoding.UTF8; pinfo.StandardOutputEncoding = Encoding.UTF8; pinfo.WorkingDirectory = working_dir; if (gacRoots.Count > 0) { // Create the gac prefix string string gacPrefix = string.Join ("" + Path.PathSeparator, gacRoots.ToArray ()); string oldGacVar = Environment.GetEnvironmentVariable ("MONO_GAC_PREFIX"); if (!string.IsNullOrEmpty (oldGacVar)) gacPrefix += Path.PathSeparator + oldGacVar; pinfo.EnvironmentVariables ["MONO_GAC_PREFIX"] = gacPrefix; } envVars.MergeTo (pinfo); pinfo.UseShellExecute = false; pinfo.RedirectStandardOutput = true; pinfo.RedirectStandardError = true; MonoDevelop.Core.Execution.ProcessWrapper pw = Runtime.ProcessService.StartProcess (pinfo, outwr, errwr, null); pw.WaitForOutput(); int exitCode = pw.ExitCode; outwr.Close(); errwr.Close(); pw.Dispose (); return exitCode; }
static int DoCompilation (IProgressMonitor monitor, string compilerName, string compilerArgs, string working_dir, ExecutionEnvironment envVars, List<string> gacRoots, ref string output, ref string error) { output = Path.GetTempFileName (); error = Path.GetTempFileName (); StreamWriter outwr = new StreamWriter (output); StreamWriter errwr = new StreamWriter (error); ProcessStartInfo pinfo = new ProcessStartInfo (compilerName, compilerArgs); pinfo.StandardErrorEncoding = Encoding.UTF8; pinfo.StandardOutputEncoding = Encoding.UTF8; // The "." is a workaround for a bug in ProcessStartInfo.WorkingDirectory - not able to handle null pinfo.WorkingDirectory = working_dir ?? "."; if (gacRoots.Count > 0) { // Create the gac prefix string string gacPrefix = string.Join ("" + Path.PathSeparator, gacRoots.ToArray ()); string oldGacVar = Environment.GetEnvironmentVariable ("MONO_GAC_PREFIX"); if (!string.IsNullOrEmpty (oldGacVar)) gacPrefix += Path.PathSeparator + oldGacVar; pinfo.EnvironmentVariables ["MONO_GAC_PREFIX"] = gacPrefix; } envVars.MergeTo (pinfo); pinfo.UseShellExecute = false; pinfo.RedirectStandardOutput = true; pinfo.RedirectStandardError = true; MonoDevelop.Core.Execution.ProcessWrapper pw = Runtime.ProcessService.StartProcess (pinfo, outwr, errwr, null); using (var mon = new AggregatedOperationMonitor (monitor, pw)) { pw.WaitForOutput (); } int exitCode = pw.ExitCode; bool cancelRequested = pw.CancelRequested; outwr.Close(); errwr.Close (); pw.Dispose(); return cancelRequested ? 0 : exitCode; }
CompilerError GetResourceId (ExecutionEnvironment env, ProjectFile finfo, ref string fname, string resgen, out string resourceId, IProgressMonitor monitor) { resourceId = finfo.ResourceId; if (resourceId == null) { LoggingService.LogDebug (GettextCatalog.GetString ("Error: Unable to build ResourceId for {0}.", fname)); monitor.Log.WriteLine (GettextCatalog.GetString ("Error: Unable to build ResourceId for {0}.", fname)); return new CompilerError (fname, 0, 0, String.Empty, GettextCatalog.GetString ("Unable to build ResourceId for {0}.", fname)); } if (String.Compare (Path.GetExtension (fname), ".resx", true) != 0) return null; if (!IsResgenRequired (fname)) { fname = Path.ChangeExtension (fname, ".resources"); return null; } if (resgen == null) { string msg = GettextCatalog.GetString ("Unable to find 'resgen' tool."); monitor.ReportError (msg, null); return new CompilerError (fname, 0, 0, String.Empty, msg); } using (StringWriter sw = new StringWriter ()) { LoggingService.LogDebug ("Compiling resources\n{0}$ {1} /compile {2}", Path.GetDirectoryName (fname), resgen, fname); monitor.Log.WriteLine (GettextCatalog.GetString ( "Compiling resource {0} with {1}", fname, resgen)); ProcessWrapper pw = null; try { ProcessStartInfo info = Runtime.ProcessService.CreateProcessStartInfo ( resgen, String.Format ("/compile \"{0}\"", fname), Path.GetDirectoryName (fname), false); env.MergeTo (info); if (PlatformID.Unix == Environment.OSVersion.Platform) info.EnvironmentVariables ["MONO_IOMAP"] = "drive"; pw = Runtime.ProcessService.StartProcess (info, sw, sw, null); } catch (System.ComponentModel.Win32Exception ex) { LoggingService.LogDebug (GettextCatalog.GetString ( "Error while trying to invoke '{0}' to compile resource '{1}' :\n {2}", resgen, fname, ex.ToString ())); monitor.Log.WriteLine (GettextCatalog.GetString ( "Error while trying to invoke '{0}' to compile resource '{1}' :\n {2}", resgen, fname, ex.Message)); return new CompilerError (fname, 0, 0, String.Empty, ex.Message); } //FIXME: Handle exceptions pw.WaitForOutput (); if (pw.ExitCode == 0) { fname = Path.ChangeExtension (fname, ".resources"); } else { string output = sw.ToString (); LoggingService.LogDebug (GettextCatalog.GetString ( "Unable to compile ({0}) {1} to .resources. \nReason: \n{2}\n", resgen, fname, output)); monitor.Log.WriteLine (GettextCatalog.GetString ( "Unable to compile ({0}) {1} to .resources. \nReason: \n{2}\n", resgen, fname, output)); //Try to get the line/pos int line = 0; int pos = 0; Match match = RegexErrorLinePos.Match (output); if (match.Success && match.Groups.Count == 3) { try { line = int.Parse (match.Groups [1].Value); } catch (FormatException){ } try { pos = int.Parse (match.Groups [2].Value); } catch (FormatException){ } } return new CompilerError (fname, line, pos, String.Empty, output); } } return null; }
private int DoCompilation (string outstr, TempFileCollection tf, string working_dir, ExecutionEnvironment envVars, ref string output) { StringWriter outwr = new StringWriter (); string[] tokens = outstr.Split (' '); try { outstr = outstr.Substring (tokens[0].Length+1); ProcessStartInfo pinfo = new ProcessStartInfo (tokens[0], "\"" + outstr + "\""); pinfo.WorkingDirectory = working_dir; envVars.MergeTo (pinfo); pinfo.UseShellExecute = false; pinfo.RedirectStandardOutput = true; pinfo.RedirectStandardError = true; ProcessWrapper pw = Runtime.ProcessService.StartProcess (pinfo, outwr, outwr, null); pw.WaitForOutput (); output = outwr.ToString (); return pw.ExitCode; } finally { if (outwr != null) outwr.Dispose (); } }