Browse Source

Use callback method for MSBuildEngine instead of Application.DoEvents() loop. Probably fixes SD2-619.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@941 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
acda9fb540
  1. 41
      src/AddIns/Misc/MbUnitPad/Project/Src/MbUnitCommands.cs
  2. 47
      src/Main/Base/Project/Src/Commands/BuildCommands.cs
  3. 12
      src/Main/Base/Project/Src/Project/AbstractProject.cs
  4. 4
      src/Main/Base/Project/Src/Project/Converter/PrjxToSolutionProject.cs
  5. 8
      src/Main/Base/Project/Src/Project/IProject.cs
  6. 49
      src/Main/Base/Project/Src/Project/MSBuildEngine.cs
  7. 56
      src/Main/Base/Project/Src/Project/MSBuildProject.cs
  8. 20
      src/Main/Base/Project/Src/Project/Solution/Solution.cs

41
src/AddIns/Misc/MbUnitPad/Project/Src/MbUnitCommands.cs

@ -96,20 +96,23 @@ namespace ICSharpCode.MbUnitPad
return; return;
} }
IProject project = c.ProjectContent.Project; IProject project = c.ProjectContent.Project;
if (project.Build().Errors.Count > 0) { MSBuildEngineCallback callback = delegate(System.CodeDom.Compiler.CompilerResults results) {
return; if (results.Errors.Count > 0) {
} return;
string mbUnitDir = Path.GetDirectoryName(typeof(ReflectorTreeView).Assembly.Location); }
ProcessStartInfo startInfo = new ProcessStartInfo(Path.Combine(mbUnitDir, "MbUnit.Cons.exe")); string mbUnitDir = Path.GetDirectoryName(typeof(ReflectorTreeView).Assembly.Location);
string assemblyPath = project.OutputAssemblyFullPath; ProcessStartInfo startInfo = new ProcessStartInfo(Path.Combine(mbUnitDir, "MbUnit.Cons.exe"));
StringBuilder sb = new StringBuilder(); string assemblyPath = project.OutputAssemblyFullPath;
sb.Append("\"/filter-type:" + c.FullyQualifiedName + "\""); StringBuilder sb = new StringBuilder();
sb.Append(" \"/assembly-path:" + Path.GetDirectoryName(assemblyPath) + "\""); sb.Append("\"/filter-type:" + c.FullyQualifiedName + "\"");
sb.Append(" \"" + assemblyPath + "\""); sb.Append(" \"/assembly-path:" + Path.GetDirectoryName(assemblyPath) + "\"");
startInfo.Arguments = sb.ToString(); sb.Append(" \"" + assemblyPath + "\"");
startInfo.WorkingDirectory = mbUnitDir; startInfo.Arguments = sb.ToString();
LoggingService.Info("Run " + startInfo.FileName + " " + startInfo.Arguments); startInfo.WorkingDirectory = mbUnitDir;
DebuggerService.CurrentDebugger.Start(startInfo); LoggingService.Info("Run " + startInfo.FileName + " " + startInfo.Arguments);
DebuggerService.CurrentDebugger.Start(startInfo);
};
project.Build(callback);
} }
} }
@ -159,7 +162,7 @@ namespace ICSharpCode.MbUnitPad
{ {
MbUnitPadContent.Instance.TreeView.ExpandAllFailures(); MbUnitPadContent.Instance.TreeView.ExpandAllFailures();
} }
} }
public class ExpandCurrentFailuresCommand : AbstractMenuCommand public class ExpandCurrentFailuresCommand : AbstractMenuCommand
{ {
@ -167,7 +170,7 @@ namespace ICSharpCode.MbUnitPad
{ {
MbUnitPadContent.Instance.TreeView.ExpandCurrentFailures(); MbUnitPadContent.Instance.TreeView.ExpandCurrentFailures();
} }
} }
public class ExpandAllIgnoredCommand : AbstractMenuCommand public class ExpandAllIgnoredCommand : AbstractMenuCommand
{ {
@ -175,7 +178,7 @@ namespace ICSharpCode.MbUnitPad
{ {
MbUnitPadContent.Instance.TreeView.ExpandAllIgnored(); MbUnitPadContent.Instance.TreeView.ExpandAllIgnored();
} }
} }
public class ExpandCurrentIgnoredCommand : AbstractMenuCommand public class ExpandCurrentIgnoredCommand : AbstractMenuCommand
{ {
@ -183,7 +186,7 @@ namespace ICSharpCode.MbUnitPad
{ {
MbUnitPadContent.Instance.TreeView.ExpandCurrentIgnored(); MbUnitPadContent.Instance.TreeView.ExpandCurrentIgnored();
} }
} }
public class ClearResultsCommand : AbstractMenuCommand public class ClearResultsCommand : AbstractMenuCommand
{ {
@ -191,5 +194,5 @@ namespace ICSharpCode.MbUnitPad
{ {
MbUnitPadContent.Instance.TreeView.ClearAllResults(); MbUnitPadContent.Instance.TreeView.ClearAllResults();
} }
} }
} }

47
src/Main/Base/Project/Src/Commands/BuildCommands.cs

@ -38,21 +38,26 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
{ {
if (CanRunBuild) { if (CanRunBuild) {
BeforeBuild(); BeforeBuild();
RunBuild(); StartBuild();
AfterBuild();
} else { } else {
MSBuildEngine.AddNoSingleFileCompilationError(); MSBuildEngine.AddNoSingleFileCompilationError();
} }
} }
public abstract void RunBuild(); protected void CallbackMethod(CompilerResults results)
{
MSBuildEngine.ShowResults(results);
AfterBuild();
}
public abstract void StartBuild();
} }
public class Build : AbstractBuildMenuCommand public class Build : AbstractBuildMenuCommand
{ {
public override void RunBuild() public override void StartBuild()
{ {
MSBuildEngine.ShowResults(ProjectService.OpenSolution.Build()); ProjectService.OpenSolution.Build(CallbackMethod);
} }
public override void AfterBuild() public override void AfterBuild()
@ -63,25 +68,25 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
public class Rebuild : Build public class Rebuild : Build
{ {
public override void RunBuild() public override void StartBuild()
{ {
MSBuildEngine.ShowResults(ProjectService.OpenSolution.Rebuild()); ProjectService.OpenSolution.Rebuild(CallbackMethod);
} }
} }
public class Clean : AbstractBuildMenuCommand public class Clean : AbstractBuildMenuCommand
{ {
public override void RunBuild() public override void StartBuild()
{ {
MSBuildEngine.ShowResults(ProjectService.OpenSolution.Clean()); ProjectService.OpenSolution.Clean(CallbackMethod);
} }
} }
public class Publish : AbstractBuildMenuCommand public class Publish : AbstractBuildMenuCommand
{ {
public override void RunBuild() public override void StartBuild()
{ {
MSBuildEngine.ShowResults(ProjectService.OpenSolution.Publish()); ProjectService.OpenSolution.Publish(CallbackMethod);
} }
} }
@ -89,16 +94,16 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
{ {
public override bool CanRunBuild { public override bool CanRunBuild {
get { get {
return base.CanRunBuild return base.CanRunBuild
&& ProjectService.CurrentProject!=null; && ProjectService.CurrentProject!=null;
} }
} }
} }
public class BuildProject : AbstractProjectBuildMenuCommand public class BuildProject : AbstractProjectBuildMenuCommand
{ {
public override void RunBuild() public override void StartBuild()
{ {
MSBuildEngine.ShowResults(ProjectService.CurrentProject.Build()); ProjectService.CurrentProject.Build(CallbackMethod);
} }
public override void AfterBuild() public override void AfterBuild()
@ -109,25 +114,25 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
public class RebuildProject : BuildProject public class RebuildProject : BuildProject
{ {
public override void RunBuild() public override void StartBuild()
{ {
MSBuildEngine.ShowResults(ProjectService.CurrentProject.Rebuild()); ProjectService.CurrentProject.Rebuild(CallbackMethod);
} }
} }
public class CleanProject : AbstractProjectBuildMenuCommand public class CleanProject : AbstractProjectBuildMenuCommand
{ {
public override void RunBuild() public override void StartBuild()
{ {
MSBuildEngine.ShowResults(ProjectService.CurrentProject.Clean()); ProjectService.CurrentProject.Clean(CallbackMethod);
} }
} }
public class PublishProject : AbstractProjectBuildMenuCommand public class PublishProject : AbstractProjectBuildMenuCommand
{ {
public override void RunBuild() public override void StartBuild()
{ {
MSBuildEngine.ShowResults(ProjectService.CurrentProject.Publish()); ProjectService.CurrentProject.Publish(CallbackMethod);
} }
} }

12
src/Main/Base/Project/Src/Project/AbstractProject.cs

@ -695,24 +695,20 @@ namespace ICSharpCode.SharpDevelop.Project
#endregion #endregion
public virtual CompilerResults Build() public virtual void Build(MSBuildEngineCallback callback)
{ {
return null;
} }
public virtual CompilerResults Rebuild() public virtual void Rebuild(MSBuildEngineCallback callback)
{ {
return null;
} }
public virtual CompilerResults Clean() public virtual void Clean(MSBuildEngineCallback callback)
{ {
return null;
} }
public virtual CompilerResults Publish() public virtual void Publish(MSBuildEngineCallback callback)
{ {
return null;
} }
/// <summary> /// <summary>

4
src/Main/Base/Project/Src/Project/Converter/PrjxToSolutionProject.cs

@ -277,7 +277,9 @@ namespace ICSharpCode.SharpDevelop.Project.Converter
Conversion conversion = new Conversion(); Conversion conversion = new Conversion();
if (Path.GetExtension(fileName).ToLowerInvariant() == ".vbproj") if (Path.GetExtension(fileName).ToLowerInvariant() == ".vbproj")
conversion.IsVisualBasic = true; conversion.IsVisualBasic = true;
Solution.ReadSolutionInformation(Solution.SolutionBeingLoaded.FileName, conversion); if (Solution.SolutionBeingLoaded != null) {
Solution.ReadSolutionInformation(Solution.SolutionBeingLoaded.FileName, conversion);
}
RunConverter(old, fileName, "vsnet2msbuild.xsl", conversion); RunConverter(old, fileName, "vsnet2msbuild.xsl", conversion);
if (File.Exists(oldUserFile)) { if (File.Exists(oldUserFile)) {
RunConverter(oldUserFile, userFile, "vsnet2msbuild_user.xsl", conversion); RunConverter(oldUserFile, userFile, "vsnet2msbuild_user.xsl", conversion);

8
src/Main/Base/Project/Src/Project/IProject.cs

@ -131,9 +131,9 @@ namespace ICSharpCode.SharpDevelop.Project
/// </summary> /// </summary>
ProjectItem CreateProjectItem(string itemType); ProjectItem CreateProjectItem(string itemType);
CompilerResults Build(); void Build(MSBuildEngineCallback callback);
CompilerResults Rebuild(); void Rebuild(MSBuildEngineCallback callback);
CompilerResults Clean(); void Clean(MSBuildEngineCallback callback);
CompilerResults Publish(); void Publish(MSBuildEngineCallback callback);
} }
} }

49
src/Main/Base/Project/Src/Project/MSBuildEngine.cs

@ -19,6 +19,8 @@ using Microsoft.Build.BuildEngine;
namespace ICSharpCode.SharpDevelop.Project namespace ICSharpCode.SharpDevelop.Project
{ {
public delegate void MSBuildEngineCallback(CompilerResults results);
/// <summary> /// <summary>
/// Class responsible for building a project using MSBuild. /// Class responsible for building a project using MSBuild.
/// Is called by MSBuildProject. /// Is called by MSBuildProject.
@ -69,11 +71,11 @@ namespace ICSharpCode.SharpDevelop.Project
} }
/// <summary> /// <summary>
/// Notifies the user that #develp's internal MSBuildEngine /// Notifies the user that #develp's internal MSBuildEngine
/// implementation only supports compiling solutions and projects; /// implementation only supports compiling solutions and projects;
/// it does not allow compiling individual files. /// it does not allow compiling individual files.
/// </summary> /// </summary>
/// <remarks>Adds a message to the <see cref="TaskService"/> and /// <remarks>Adds a message to the <see cref="TaskService"/> and
/// shows the <see cref="ErrorListPad"/>.</remarks> /// shows the <see cref="ErrorListPad"/>.</remarks>
public static void AddNoSingleFileCompilationError() public static void AddNoSingleFileCompilationError()
{ {
@ -82,7 +84,7 @@ namespace ICSharpCode.SharpDevelop.Project
TaskService.Add(new Task(null, StringParser.Parse("${res:BackendBindings.ExecutionManager.NoSingleFileCompilation}"), 0, 0, TaskType.Error)); TaskService.Add(new Task(null, StringParser.Parse("${res:BackendBindings.ExecutionManager.NoSingleFileCompilation}"), 0, 0, TaskType.Error));
WorkbenchSingleton.Workbench.GetPad(typeof(ErrorListPad)).BringPadToFront(); WorkbenchSingleton.Workbench.GetPad(typeof(ErrorListPad)).BringPadToFront();
} }
#endregion #endregion
MessageViewCategory messageView; MessageViewCategory messageView;
@ -136,48 +138,41 @@ namespace ICSharpCode.SharpDevelop.Project
} }
} }
public CompilerResults Run(string buildFile) public void Run(string buildFile, MSBuildEngineCallback callback)
{ {
return Run(buildFile, null); Run(buildFile, null, callback);
} }
static bool IsRunning = false; volatile static bool isRunning = false;
public CompilerResults Run(string buildFile, string[] targets) public void Run(string buildFile, string[] targets, MSBuildEngineCallback callback)
{ {
CompilerResults results = new CompilerResults(null); if (isRunning) {
if (IsRunning) { CompilerResults results = new CompilerResults(null);
results.Errors.Add(new CompilerError(null, 0, 0, null, "MsBuild is already running!")); results.Errors.Add(new CompilerError(null, 0, 0, null, "MSBuild is already running!"));
return results; callback(results);
} } else {
IsRunning = true; isRunning = true;
try { Thread thread = new Thread(new ThreadStarter(buildFile, targets, this, callback).Run);
Thread thread = new Thread(new ThreadStarter(results, buildFile, targets, this).Run);
thread.SetApartmentState(ApartmentState.STA); thread.SetApartmentState(ApartmentState.STA);
thread.Start(); thread.Start();
while (!thread.Join(10)) {
Application.DoEvents();
Application.DoEvents();
}
return results;
} finally {
IsRunning = false;
} }
} }
class ThreadStarter class ThreadStarter
{ {
CompilerResults results; CompilerResults results = new CompilerResults(null);
string buildFile; string buildFile;
string[] targets; string[] targets;
MSBuildEngine engine; MSBuildEngine engine;
MSBuildEngineCallback callback;
public ThreadStarter(CompilerResults results, string buildFile, string[] targets, MSBuildEngine engine) public ThreadStarter(string buildFile, string[] targets, MSBuildEngine engine, MSBuildEngineCallback callback)
{ {
this.results = results;
this.buildFile = buildFile; this.buildFile = buildFile;
this.targets = targets; this.targets = targets;
this.engine = engine; this.engine = engine;
this.callback = callback;
} }
[STAThread] [STAThread]
@ -207,6 +202,10 @@ namespace ICSharpCode.SharpDevelop.Project
engine.BuildProject(project, targets); engine.BuildProject(project, targets);
LoggingService.Debug("MSBuild finished"); LoggingService.Debug("MSBuild finished");
MSBuildEngine.isRunning = false;
if (callback != null) {
WorkbenchSingleton.MainForm.BeginInvoke(callback, results);
}
} }
} }

56
src/Main/Base/Project/Src/Project/MSBuildProject.cs

@ -396,36 +396,9 @@ namespace ICSharpCode.SharpDevelop.Project
} }
#endregion #endregion
// static void BeforeBuild() public static void RunMSBuild(string fileName, string target, string configuration, string platform, bool isSingleProject, MSBuildEngineCallback callback)
// {
// TaskService.NotifyTaskChange();
//
// StatusBarService.SetMessage("${res:MainWindow.StatusBar.CompilingMessage}");
//
// StringParser.Properties["Project"] = this.Name;
//
// TaskService.BuildMessageViewCategory.AppendText(StringParser.Parse("${res:MainWindow.CompilerMessages.BuildStartedOutput}", new string[,] {
// {"PROJECT", this.Name},
// {"CONFIG", this.Configuration + "|" + this.Platform}
// }) + Environment.NewLine);
// TaskService.BuildMessageViewCategory.AppendText(StringParser.Parse("${res:MainWindow.CompilerMessages.PerformingMainCompilationOutput}") + Environment.NewLine);
// // TODO :BEFORE COMPILE ACTION.
// //TaskService.CompilerOutput += StringParser.Parse("${res:MainWindow.CompilerMessages.ExecuteScript}", new string[,] { {"SCRIPT", conf.ExecuteBeforeBuild} }) + "\n";
// }
//
// static void AfterBuild()
// {
// // TODO: After COMPILE ACTION.
// //TaskService.CompilerOutput += StringParser.Parse("${res:MainWindow.CompilerMessages.ExecuteScript}", new string[,] { {"SCRIPT", conf.ExecuteAfterBuild} }) + "\n";
//
// TaskService.BuildMessageViewCategory.AppendText(StringParser.Parse("${res:MainWindow.CompilerMessages.ProjectStatsOutput}", new string[,] { {"ERRORS", TaskService.Errors.ToString()}, {"WARNINGS", TaskService.Warnings.ToString()} }) + Environment.NewLine + Environment.NewLine);
// isDirty = TaskService.Errors != 0;
// }
public static CompilerResults RunMSBuild(string fileName, string target, string configuration, string platform, bool isSingleProject)
{ {
WorkbenchSingleton.Workbench.GetPad(typeof(CompilerMessageView)).BringPadToFront(); WorkbenchSingleton.Workbench.GetPad(typeof(CompilerMessageView)).BringPadToFront();
// BeforeBuild();
MSBuildEngine engine = new MSBuildEngine(); MSBuildEngine engine = new MSBuildEngine();
if (isSingleProject) { if (isSingleProject) {
string dir = ProjectService.OpenSolution.Directory; string dir = ProjectService.OpenSolution.Directory;
@ -437,37 +410,36 @@ namespace ICSharpCode.SharpDevelop.Project
engine.Platform = platform; engine.Platform = platform;
engine.MessageView = TaskService.BuildMessageViewCategory; engine.MessageView = TaskService.BuildMessageViewCategory;
if (target == null) { if (target == null) {
return engine.Run(fileName); engine.Run(fileName, callback);
} else {
engine.Run(fileName, new string[] { target }, callback);
} }
return engine.Run(fileName, new string[] { target });
// AfterBuild();
} }
public CompilerResults RunMSBuild(string target) public void RunMSBuild(string target, MSBuildEngineCallback callback)
{ {
return RunMSBuild(this.FileName, target, this.Configuration, this.Platform, true); RunMSBuild(this.FileName, target, this.Configuration, this.Platform, true, callback);
} }
public override CompilerResults Build() public override void Build(MSBuildEngineCallback callback)
{ {
return RunMSBuild("Build"); RunMSBuild("Build", callback);
} }
public override CompilerResults Rebuild() public override void Rebuild(MSBuildEngineCallback callback)
{ {
return RunMSBuild("Rebuild"); RunMSBuild("Rebuild", callback);
} }
public override CompilerResults Clean() public override void Clean(MSBuildEngineCallback callback)
{ {
CompilerResults result = RunMSBuild("Clean"); RunMSBuild("Clean", callback);
isDirty = true; isDirty = true;
return result;
} }
public override CompilerResults Publish() public override void Publish(MSBuildEngineCallback callback)
{ {
return RunMSBuild("Publish"); RunMSBuild("Publish", callback);
} }
public override string ToString() public override string ToString()

20
src/Main/Base/Project/Src/Project/Solution/Solution.cs

@ -625,29 +625,29 @@ namespace ICSharpCode.SharpDevelop.Project
} }
#endregion #endregion
public CompilerResults RunMSBuild(string target) public void RunMSBuild(string target, MSBuildEngineCallback callback)
{ {
return MSBuildProject.RunMSBuild(FileName, target, preferences.ActiveConfiguration, preferences.ActivePlatform, false); MSBuildProject.RunMSBuild(FileName, target, preferences.ActiveConfiguration, preferences.ActivePlatform, false, callback);
} }
public CompilerResults Build() public void Build(MSBuildEngineCallback callback)
{ {
return RunMSBuild(null); RunMSBuild(null, callback);
} }
public CompilerResults Rebuild() public void Rebuild(MSBuildEngineCallback callback)
{ {
return RunMSBuild("Rebuild"); RunMSBuild("Rebuild", callback);
} }
public CompilerResults Clean() public void Clean(MSBuildEngineCallback callback)
{ {
return RunMSBuild("Clean"); RunMSBuild("Clean", callback);
} }
public CompilerResults Publish() public void Publish(MSBuildEngineCallback callback)
{ {
return RunMSBuild("Publish"); RunMSBuild("Publish", callback);
} }
} }
} }

Loading…
Cancel
Save