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. 5
      src/AddIns/Misc/MbUnitPad/Project/Src/MbUnitCommands.cs
  2. 43
      src/Main/Base/Project/Src/Commands/BuildCommands.cs
  3. 12
      src/Main/Base/Project/Src/Project/AbstractProject.cs
  4. 2
      src/Main/Base/Project/Src/Project/Converter/PrjxToSolutionProject.cs
  5. 8
      src/Main/Base/Project/Src/Project/IProject.cs
  6. 41
      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

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

@ -96,7 +96,8 @@ 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) {
if (results.Errors.Count > 0) {
return; return;
} }
string mbUnitDir = Path.GetDirectoryName(typeof(ReflectorTreeView).Assembly.Location); string mbUnitDir = Path.GetDirectoryName(typeof(ReflectorTreeView).Assembly.Location);
@ -110,6 +111,8 @@ namespace ICSharpCode.MbUnitPad
startInfo.WorkingDirectory = mbUnitDir; startInfo.WorkingDirectory = mbUnitDir;
LoggingService.Info("Run " + startInfo.FileName + " " + startInfo.Arguments); LoggingService.Info("Run " + startInfo.FileName + " " + startInfo.Arguments);
DebuggerService.CurrentDebugger.Start(startInfo); DebuggerService.CurrentDebugger.Start(startInfo);
};
project.Build(callback);
} }
} }

43
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);
} }
} }
@ -96,9 +101,9 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
} }
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>

2
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;
if (Solution.SolutionBeingLoaded != null) {
Solution.ReadSolutionInformation(Solution.SolutionBeingLoaded.FileName, conversion); 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);
} }
} }

41
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.
@ -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)
{ {
if (isRunning) {
CompilerResults results = new CompilerResults(null); CompilerResults results = new CompilerResults(null);
if (IsRunning) { 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!")); callback(results);
return results; } else {
} isRunning = true;
IsRunning = true; Thread thread = new Thread(new ThreadStarter(buildFile, targets, this, callback).Run);
try {
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