public static RemoteProjectBuilder GetProjectBuilder (TargetRuntime runtime, TargetFramework fx, string file) { lock (builders) { string binDir = runtime.GetMSBuildBinPath (fx); RemoteBuildEngine builder; if (builders.TryGetValue (runtime, out builder)) { builder.ReferenceCount++; return new RemoteProjectBuilder (file, binDir, builder); } if (runtime.IsRunning) { if (currentBuildEngine == null) currentBuildEngine = new RemoteBuildEngine (null, new BuildEngine ()); return new RemoteProjectBuilder (file, binDir, currentBuildEngine); } else { MonoDevelop.Core.Execution.RemotingService.RegisterRemotingChannel (); string exe = typeof(ProjectBuilder).Assembly.Location; ProcessStartInfo pinfo = new ProcessStartInfo (exe); foreach (KeyValuePair<string,string> evar in runtime.GetToolsEnvironmentVariables (fx)) pinfo.EnvironmentVariables [evar.Key] = evar.Value; pinfo.UseShellExecute = false; pinfo.RedirectStandardError = true; pinfo.RedirectStandardInput = true; Process p = null; try { p = runtime.ExecuteAssembly (pinfo, fx); p.StandardInput.WriteLine (Process.GetCurrentProcess ().Id.ToString ()); string sref = p.StandardError.ReadLine (); byte[] data = Convert.FromBase64String (sref); MemoryStream ms = new MemoryStream (data); BinaryFormatter bf = new BinaryFormatter (); builder = new RemoteBuildEngine (p, (IBuildEngine) bf.Deserialize (ms)); } catch { if (p != null) { try { p.Kill (); } catch { } } throw; } } builders [runtime] = builder; builder.ReferenceCount = 1; return new RemoteProjectBuilder (file, binDir, builder); } }