Browse Source

Rewritten build system. Separated solution build logic (BuildEngine) from project build logic (MSBuildEngine).

New features:
- Supports non-MSBuild projects.
- Setting different properties for each project in a solution.
- Build can run in a worker process 
- Builds multiple projects in parallel

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2694 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
fef7d40907
  1. 2
      data/templates/file/CSharp/CSharp.Interface.xft
  2. 6
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/VbcEncodingFixingLogger.cs
  3. 8
      src/AddIns/Misc/CodeAnalysis/Src/FxCopLogger.cs
  4. 8
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  5. 49
      src/Main/Base/Project/Resources/ProjectAndSolutionOptionsPanel.xfrm
  6. 12
      src/Main/Base/Project/Src/Commands/BuildCommands.cs
  7. 14
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/IDEOptions/ProjectAndSolutionOptionsPanel.cs
  8. 4
      src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs
  9. 19
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/NodeBuilder/DefaultDotNetNodeBuilder.cs
  10. 2
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs
  11. 2
      src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceLayout.cs
  12. 2
      src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs
  13. 28
      src/Main/Base/Project/Src/Project/AbstractProject.cs
  14. 492
      src/Main/Base/Project/Src/Project/BuildEngine.cs
  15. 96
      src/Main/Base/Project/Src/Project/BuildOptions.cs
  16. 36
      src/Main/Base/Project/Src/Project/IBuildFeedbackSink.cs
  17. 24
      src/Main/Base/Project/Src/Project/IProject.cs
  18. 14
      src/Main/Base/Project/Src/Project/MSBuildAdditionalLogger.cs
  19. 22
      src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs
  20. 571
      src/Main/Base/Project/Src/Project/MSBuildEngine.cs
  21. 253
      src/Main/Base/Project/Src/Project/MSBuildEngineWorker.cs
  22. 30
      src/Main/Base/Project/Src/Project/MSBuildFileProject.cs
  23. 20
      src/Main/Base/Project/Src/Project/Solution/Solution.cs
  24. 12
      src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingService.cs
  25. 2
      src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs
  26. 4
      src/Main/Base/Project/Src/Util/ExtensionMethods.cs
  27. 52
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/BuildJob.cs
  28. 16
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/Configuration/AssemblyInfo.cs
  29. 79
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/EventSource.cs
  30. 70
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/ICSharpCode.SharpDevelop.BuildWorker.csproj
  31. 102
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/HostProcess.cs
  32. 16
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/IHostObject.cs
  33. 138
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/PacketReceiver.cs
  34. 67
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/PacketSender.cs
  35. 224
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/WorkerProcess.cs
  36. 323
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/Program.cs
  37. 265
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/WorkerManager.cs
  38. 15
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/app.config
  39. 175
      src/SharpDevelop.Tests.sln
  40. 293
      src/SharpDevelop.sln

2
data/templates/file/CSharp/CSharp.Interface.xft

@ -30,7 +30,7 @@ namespace ${StandardNamespace} @@ -30,7 +30,7 @@ namespace ${StandardNamespace}
/// <summary>
/// Description of ${ClassName}.
/// </summary>
public interface I${ClassName}
public interface ${ClassName}
{
}

6
src/AddIns/BackendBindings/VBNetBinding/Project/Src/VbcEncodingFixingLogger.cs

@ -18,16 +18,16 @@ namespace VBNetBinding @@ -18,16 +18,16 @@ namespace VBNetBinding
/// </summary>
public class VbcEncodingFixingLogger : IMSBuildAdditionalLogger
{
public ILogger CreateLogger(MSBuildEngineWorker engineWorker)
public ILogger CreateLogger(MSBuildEngine engineWorker)
{
return new VbcLoggerImpl(engineWorker);
}
private class VbcLoggerImpl : ILogger
{
MSBuildEngineWorker engineWorker;
MSBuildEngine engineWorker;
public VbcLoggerImpl(MSBuildEngineWorker engineWorker)
public VbcLoggerImpl(MSBuildEngine engineWorker)
{
this.engineWorker = engineWorker;
}

8
src/AddIns/Misc/CodeAnalysis/Src/FxCopLogger.cs

@ -17,16 +17,16 @@ namespace ICSharpCode.CodeAnalysis @@ -17,16 +17,16 @@ namespace ICSharpCode.CodeAnalysis
{
public class FxCopLogger : IMSBuildAdditionalLogger
{
public ILogger CreateLogger(MSBuildEngineWorker engineWorker)
public ILogger CreateLogger(MSBuildEngine engineWorker)
{
return new FxCopLoggerImpl(engineWorker);
}
private class FxCopLoggerImpl : ILogger
{
MSBuildEngineWorker engineWorker;
MSBuildEngine engineWorker;
public FxCopLoggerImpl(MSBuildEngineWorker engineWorker)
public FxCopLoggerImpl(MSBuildEngine engineWorker)
{
this.engineWorker = engineWorker;
}
@ -54,7 +54,7 @@ namespace ICSharpCode.CodeAnalysis @@ -54,7 +54,7 @@ namespace ICSharpCode.CodeAnalysis
public void Initialize(IEventSource eventSource)
{
this.eventSource = eventSource;
engineWorker.OutputText("${res:ICSharpCode.CodeAnalysis.RunningFxCopOn} " + Path.GetFileNameWithoutExtension(engineWorker.CurrentProjectFile) + "\r\n");
engineWorker.OutputText("${res:ICSharpCode.CodeAnalysis.RunningFxCopOn} " + Path.GetFileNameWithoutExtension(engineWorker.CurrentProjectFile));
eventSource.ErrorRaised += OnError;
eventSource.WarningRaised += OnWarning;
}

8
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -95,7 +95,9 @@ @@ -95,7 +95,9 @@
<Compile Include="Src\Internal\Undo\IUndoableOperation.cs" />
<Compile Include="Src\Internal\Undo\UndoQueue.cs" />
<Compile Include="Src\Internal\Undo\UndoStack.cs" />
<Compile Include="Src\Project\MSBuildEngineWorker.cs" />
<Compile Include="Src\Project\BuildEngine.cs" />
<Compile Include="Src\Project\IBuildFeedbackSink.cs" />
<Compile Include="Src\Project\MSBuildFileProject.cs" />
<Compile Include="Src\Project\ProjectPropertyChangedEventArgs.cs" />
<Compile Include="Src\Services\Debugger\BreakpointBookmark.cs" />
<Compile Include="Src\Services\Debugger\BreakpointBookmarkEventArgs.cs" />
@ -715,6 +717,10 @@ @@ -715,6 +717,10 @@
<Folder Include="Src\Util" />
<Folder Include="Src\Gui\Pads\ClassBrowser\NodeBuilder" />
<Folder Include="Src\Services\NavigationService" />
<ProjectReference Include="..\..\ICSharpCode.SharpDevelop.BuildWorker\ICSharpCode.SharpDevelop.BuildWorker.csproj">
<Project>{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}</Project>
<Name>ICSharpCode.SharpDevelop.BuildWorker</Name>
</ProjectReference>
<ProjectReference Include="..\..\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj">
<Project>{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}</Project>
<Name>ICSharpCode.SharpDevelop.Dom</Name>

49
src/Main/Base/Project/Resources/ProjectAndSolutionOptionsPanel.xfrm

@ -5,64 +5,81 @@ @@ -5,64 +5,81 @@
<Controls>
<System.Windows.Forms.GroupBox>
<Name value="CreatedObject2" />
<Location value="{X=8,Y=8}" />
<Location value="8, 8" />
<Text value="${res:Dialog.Options.IDEOptions.ProjectAndSolutionOptions.SettingsGroupBox}" />
<Size value="336, 104" />
<Anchor value="Top, Left, Right" />
<Size value="{Width=336, Height=104}" />
<TabIndex value="0" />
<Controls>
<System.Windows.Forms.Button>
<Name value="selectProjectLocationButton" />
<Location value="{X=294,Y=32}" />
<Location value="294, 32" />
<Text value="..." />
<Size value="32, 21" />
<Anchor value="Top, Right" />
<Size value="{Width=32, Height=21}" />
<TabIndex value="6" />
</System.Windows.Forms.Button>
<System.Windows.Forms.TextBox>
<Name value="projectLocationTextBox" />
<TabIndex value="1" />
<Size value="{Width=280, Height=21}" />
<Location value="{X=8,Y=32}" />
<Location value="8, 32" />
<Anchor value="Top, Left, Right" />
<Size value="280, 20" />
</System.Windows.Forms.TextBox>
<System.Windows.Forms.Label>
<Name value="label" />
<Location value="{X=8,Y=16}" />
<Location value="8, 16" />
<Text value="${res:Dialog.Options.IDEOptions.ProjectAndSolutionOptions.ProjectLocationLabel}" />
<Anchor value="Top, Left, Right" />
<Size value="320, 16" />
<TextAlign value="BottomLeft" />
<Size value="{Width=320, Height=16}" />
<Anchor value="Top, Left, Right" />
<TabIndex value="0" />
</System.Windows.Forms.Label>
<System.Windows.Forms.CheckBox>
<Name value="loadPrevProjectCheckBox" />
<Location value="{X=8,Y=56}" />
<Location value="8, 56" />
<Text value="${res:Dialog.Options.IDEOptions.ProjectAndSolutionOptions.LoadPrevProjectCheckBox}" />
<TabIndex value="8" />
<Size value="{Width=320, Height=32}" />
<Size value="320, 32" />
<Anchor value="Top, Left, Right" />
</System.Windows.Forms.CheckBox>
</Controls>
</System.Windows.Forms.GroupBox>
<System.Windows.Forms.GroupBox>
<Name value="CreatedObject27" />
<Location value="{X=8,Y=128}" />
<Location value="8, 128" />
<Text value="${res:Dialog.Options.IDEOptions.ProjectAndSolutionOptions.BuildAndRunGroupBox}" />
<Size value="336, 105" />
<Anchor value="Top, Bottom, Left, Right" />
<Size value="{Width=336, Height=86}" />
<TabIndex value="1" />
<Controls>
<System.Windows.Forms.NumericUpDown>
<Name value="parallelBuildNumericUpDown" />
<Value value="1" />
<TabIndex value="13" />
<Minimum value="1" />
<Location value="227, 66" />
<Maximum value="8" />
<Size value="49, 20" />
</System.Windows.Forms.NumericUpDown>
<System.Windows.Forms.Label>
<Name value="label1" />
<Location value="9, 68" />
<Text value="Number of projects to build in parallel:" />
<Size value="212, 23" />
<TextAlign value="TopRight" />
<TabIndex value="12" />
</System.Windows.Forms.Label>
<System.Windows.Forms.CheckBox>
<Name value="showErrorListCheckBox" />
<Location value="{X=8,Y=35}" />
<Location value="8, 28" />
<Text value="${res:Dialog.Options.IDEOptions.ProjectAndSolutionOptions.ShowErrorListPadCheckBox}" />
<TabIndex value="10" />
<Size value="{Width=320, Height=32}" />
<Size value="320, 32" />
<Anchor value="Top, Left, Right" />
</System.Windows.Forms.CheckBox>
</Controls>
</System.Windows.Forms.GroupBox>
</Controls>
</System.Windows.Forms.UserControl>
</Components>
</Components>

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

@ -106,7 +106,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -106,7 +106,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
public override void StartBuild()
{
ProjectService.RaiseEventStartBuild();
ProjectService.OpenSolution.StartBuild(new BuildOptions(BuildTarget.Build, CallbackMethod));
BuildEngine.BuildInGui(ProjectService.OpenSolution, new BuildOptions(BuildTarget.Build, CallbackMethod));
}
public override void AfterBuild()
@ -120,7 +120,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -120,7 +120,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
public override void StartBuild()
{
ProjectService.RaiseEventStartBuild();
ProjectService.OpenSolution.StartBuild(new BuildOptions(BuildTarget.Rebuild, CallbackMethod));
BuildEngine.BuildInGui(ProjectService.OpenSolution, new BuildOptions(BuildTarget.Rebuild, CallbackMethod));
}
public override void AfterBuild()
@ -133,7 +133,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -133,7 +133,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
{
public override void StartBuild()
{
ProjectService.OpenSolution.StartBuild(new BuildOptions(BuildTarget.Clean, CallbackMethod));
BuildEngine.BuildInGui(ProjectService.OpenSolution, new BuildOptions(BuildTarget.Clean, CallbackMethod));
}
}
@ -173,7 +173,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -173,7 +173,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
public override void StartBuild()
{
ProjectService.RaiseEventStartBuild();
this.ProjectToBuild.StartBuild(new BuildOptions(BuildTarget.Build, CallbackMethod, AdditionalProperties));
BuildEngine.BuildInGui(this.ProjectToBuild, new BuildOptions(BuildTarget.Build, CallbackMethod, AdditionalProperties));
}
public override void AfterBuild()
@ -190,7 +190,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -190,7 +190,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
public override void StartBuild()
{
ProjectService.RaiseEventStartBuild();
this.ProjectToBuild.StartBuild(new BuildOptions(BuildTarget.Rebuild, CallbackMethod, AdditionalProperties));
BuildEngine.BuildInGui(this.ProjectToBuild, new BuildOptions(BuildTarget.Rebuild, CallbackMethod, AdditionalProperties));
}
}
@ -198,7 +198,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -198,7 +198,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
{
public override void StartBuild()
{
this.ProjectToBuild.StartBuild(new BuildOptions(BuildTarget.Clean, CallbackMethod, null));
BuildEngine.BuildInGui(this.ProjectToBuild, new BuildOptions(BuildTarget.Clean, CallbackMethod));
}
}

14
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/IDEOptions/ProjectAndSolutionOptionsPanel.cs

@ -21,11 +21,12 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -21,11 +21,12 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
// read properties
ControlDictionary["projectLocationTextBox"].Text = PropertyService.Get("ICSharpCode.SharpDevelop.Gui.Dialogs.NewProjectDialog.DefaultPath",
Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),
"SharpDevelop Projects")).ToString();
Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),
"SharpDevelop Projects")).ToString();
((CheckBox)ControlDictionary["loadPrevProjectCheckBox"]).Checked = PropertyService.Get("SharpDevelop.LoadPrevProjectOnStartup", false);
((CheckBox)ControlDictionary["showErrorListCheckBox"]).Checked = ErrorListPad.ShowAfterBuild;
((CheckBox)ControlDictionary["showErrorListCheckBox"]).Checked = Project.BuildOptions.ShowErrorListAfterBuild;
((NumericUpDown)ControlDictionary["parallelBuildNumericUpDown"]).Value = Project.BuildOptions.DefaultParallelProjectCount;
((Button)ControlDictionary["selectProjectLocationButton"]).Click += new EventHandler(SelectProjectLocationButtonClicked);
}
@ -42,9 +43,10 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -42,9 +43,10 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
}
// set properties
PropertyService.Set("ICSharpCode.SharpDevelop.Gui.Dialogs.NewProjectDialog.DefaultPath", projectPath);
PropertyService.Set("ICSharpCode.SharpDevelop.Gui.Dialogs.NewProjectDialog.DefaultPath", projectPath);
PropertyService.Set("SharpDevelop.LoadPrevProjectOnStartup", ((CheckBox)ControlDictionary["loadPrevProjectCheckBox"]).Checked);
ErrorListPad.ShowAfterBuild = ((CheckBox)ControlDictionary["showErrorListCheckBox"]).Checked;
Project.BuildOptions.ShowErrorListAfterBuild = ((CheckBox)ControlDictionary["showErrorListCheckBox"]).Checked;
Project.BuildOptions.DefaultParallelProjectCount = (int)((NumericUpDown)ControlDictionary["parallelBuildNumericUpDown"]).Value;
return true;
}

4
src/Main/Base/Project/Src/Gui/Pads/ErrorList/ErrorListPad.cs

@ -63,10 +63,10 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -63,10 +63,10 @@ namespace ICSharpCode.SharpDevelop.Gui
public static bool ShowAfterBuild {
get {
return PropertyService.Get("SharpDevelop.ShowErrorListAfterBuild", true);
return Project.BuildOptions.ShowErrorListAfterBuild;
}
set {
PropertyService.Set("SharpDevelop.ShowErrorListAfterBuild", value);
Project.BuildOptions.ShowErrorListAfterBuild = value;
}
}

19
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/NodeBuilder/DefaultDotNetNodeBuilder.cs

@ -31,18 +31,13 @@ namespace ICSharpCode.SharpDevelop.Project @@ -31,18 +31,13 @@ namespace ICSharpCode.SharpDevelop.Project
missingNode.Text = ResourceService.GetString("ICSharpCode.SharpDevelop.Commands.ProjectBrowser.ProjectFileNotFound");
missingNode.AddTo(projectNode);
} else if (project is UnknownProject) {
string ext = Path.GetExtension(project.FileName);
if (".proj".Equals(ext, StringComparison.OrdinalIgnoreCase)
|| ".build".Equals(ext, StringComparison.OrdinalIgnoreCase))
{
projectNode.OpenedImage = projectNode.ClosedImage = "Icons.16x16.XMLFileIcon";
projectNode.Nodes.Clear();
} else {
CustomNode unknownNode = new CustomNode();
unknownNode.SetIcon("Icons.16x16.Warning");
unknownNode.Text = StringParser.Parse(((UnknownProject)project).WarningText);
unknownNode.AddTo(projectNode);
}
CustomNode unknownNode = new CustomNode();
unknownNode.SetIcon("Icons.16x16.Warning");
unknownNode.Text = StringParser.Parse(((UnknownProject)project).WarningText);
unknownNode.AddTo(projectNode);
} else if (project is MSBuildFileProject) {
projectNode.OpenedImage = projectNode.ClosedImage = "Icons.16x16.XMLFileIcon";
projectNode.Nodes.Clear();
} else {
new ReferenceFolder(project).AddTo(projectNode);
}

2
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs

@ -112,7 +112,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -112,7 +112,7 @@ namespace ICSharpCode.SharpDevelop.Project
public override void ActivateItem()
{
if (project is UnknownProject && Nodes.Count == 0) {
if (project is MSBuildFileProject) {
FileService.OpenFile(project.FileName);
}
}

2
src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceLayout.cs

@ -579,7 +579,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -579,7 +579,7 @@ namespace ICSharpCode.SharpDevelop.Gui
content.Control.Dock = DockStyle.Fill;
SdiWorkspaceWindow sdiWorkspaceWindow = new SdiWorkspaceWindow();
sdiWorkspaceWindow.ViewContents.Add(content);
content.SecondaryViewContents.Apply(sdiWorkspaceWindow.ViewContents.Add);
content.SecondaryViewContents.Foreach(sdiWorkspaceWindow.ViewContents.Add);
sdiWorkspaceWindow.CloseEvent += new EventHandler(CloseWindowEvent);
if (dockPanel != null) {
sdiWorkspaceWindow.Show(dockPanel);

2
src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs

@ -332,7 +332,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -332,7 +332,7 @@ namespace ICSharpCode.SharpDevelop.Gui
case DialogResult.Yes:
if (ActiveViewContent.PrimaryFile != null) {
while (true) {
ActiveViewContent.Files.Apply(ICSharpCode.SharpDevelop.Commands.SaveFile.Save);
ActiveViewContent.Files.Foreach(ICSharpCode.SharpDevelop.Commands.SaveFile.Save);
if (ActiveViewContent.IsDirty) {
if (MessageService.AskQuestion("${res:MainWindow.DiscardChangesMessage}")) {

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

@ -401,10 +401,6 @@ namespace ICSharpCode.SharpDevelop.Project @@ -401,10 +401,6 @@ namespace ICSharpCode.SharpDevelop.Project
return null;
}
public virtual void StartBuild(BuildOptions options)
{
}
/// <summary>
/// Creates a new projectItem for the passed itemType
/// </summary>
@ -452,5 +448,29 @@ namespace ICSharpCode.SharpDevelop.Project @@ -452,5 +448,29 @@ namespace ICSharpCode.SharpDevelop.Project
public virtual void ResolveAssemblyReferences()
{
}
public virtual void StartBuild(ProjectBuildOptions options, IBuildFeedbackSink feedbackSink)
{
feedbackSink.ReportError(new BuildError { ErrorText = "Building project " + Name + " is not supported.", IsWarning = true });
// we don't know how to build anything, report that we're done.
feedbackSink.Done(true);
}
public virtual ICollection<IBuildable> GetBuildDependencies(ProjectBuildOptions buildOptions)
{
List<IBuildable> result = new List<IBuildable>();
foreach (ProjectSection section in this.ProjectSections) {
if (section.Name == "ProjectDependencies") {
foreach (SolutionItem item in section.Items) {
foreach (IProject p in ParentSolution.Projects) {
if (p.IdGuid == item.Name) {
result.Add(p);
}
}
}
}
}
return result;
}
}
}

492
src/Main/Base/Project/Src/Project/BuildEngine.cs

@ -0,0 +1,492 @@ @@ -0,0 +1,492 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using System.Linq;
namespace ICSharpCode.SharpDevelop.Project
{
/// <summary>
/// Supports building a project with dependencies or the whole solution.
/// Creates a build graph and then builds it using topological sort.
///
/// Supports building multiple projects in parallel.
/// </summary>
public sealed class BuildEngine
{
#region Building in the SharpDevelop GUI
static bool guiBuildRunning;
public static void BuildInGui(IBuildable project, BuildOptions options)
{
if (guiBuildRunning) {
BuildResults results = new BuildResults();
results.Add(new BuildError(null, Core.ResourceService.GetString("MainWindow.CompilerMessages.MSBuildAlreadyRunning")));
results.Result = BuildResultCode.MSBuildAlreadyRunning;
options.Callback(results);
} else {
Gui.WorkbenchSingleton.Workbench.GetPad(typeof(Gui.CompilerMessageView)).BringPadToFront();
StartBuild(project, options, new MessageViewSink(TaskService.BuildMessageViewCategory));
}
}
sealed class MessageViewSink : IBuildFeedbackSink
{
Gui.MessageViewCategory messageView;
public MessageViewSink(ICSharpCode.SharpDevelop.Gui.MessageViewCategory messageView)
{
this.messageView = messageView;
}
public void ReportError(BuildError error)
{
}
public void ReportMessage(string message)
{
messageView.AppendLine(message);
}
public void Done(bool success)
{
guiBuildRunning = false;
}
}
#endregion
#region StartBuild
public static void StartBuild(IBuildable project, BuildOptions options, IBuildFeedbackSink realtimeBuildFeedbackSink)
{
if (project == null)
throw new ArgumentNullException("solution");
if (options == null)
throw new ArgumentNullException("options");
Solution solution = project.ParentSolution;
if (solution == null)
throw new ArgumentException("project.ParentSolution must not be null", "project");
if (string.IsNullOrEmpty(options.SolutionConfiguration))
options.SolutionConfiguration = solution.Preferences.ActiveConfiguration;
if (string.IsNullOrEmpty(options.SolutionPlatform))
options.SolutionPlatform = solution.Preferences.ActivePlatform;
BuildEngine engine = new BuildEngine(options, project);
engine.buildStart = DateTime.Now;
engine.combinedBuildFeedbackSink = realtimeBuildFeedbackSink;
engine.configMatchings = solution.GetActiveConfigurationsAndPlatformsForProjects(options.SolutionConfiguration, options.SolutionPlatform);
try {
engine.rootNode = engine.CreateBuildGraph(project);
} catch (CyclicDependencyException ex) {
if (ex.Project1 != null && ex.Project2 != null)
engine.results.Add(new BuildError(null, "Cyclic dependency between " + ex.Project1.Name + " and " + ex.Project2.Name));
else
engine.results.Add(new BuildError(null, "Cyclic dependency"));
engine.results.Result = BuildResultCode.BuildFileError;
realtimeBuildFeedbackSink.Done(false);
options.Callback(engine.results);
return;
}
engine.workersToStart = options.ParallelProjectCount;
if (engine.workersToStart < 1)
engine.workersToStart = 1;
engine.ReportMessageInternal("${res:MainWindow.CompilerMessages.BuildStarted}");
engine.StartBuildProjects();
}
#endregion
#region inner class BuildNode
sealed class BuildNode : IBuildFeedbackSink
{
readonly BuildEngine engine;
internal readonly IBuildable project;
internal ProjectBuildOptions options;
internal BuildNode[] dependencies;
/// <summary>specifies whether the node has been constructed completely (all dependencies initialized)</summary>
internal bool nodeComplete;
/// <summary>specifies whether this node has started building</summary>
internal bool buildStarted;
/// <summary>specifies whether this node has finished building</summary>
internal bool buildFinished;
/// <summary>specifies whether the node produces build errors</summary>
internal bool hasErrors;
/// <summary>The number of dependencies missing until this node can be built</summary>
internal int outstandingDependencies;
/// <summary>The list of nodes that directly depend on this node</summary>
internal List<BuildNode> dependentOnThis = new List<BuildNode>();
int totalDependentOnThisCount = -1;
/// <summary>Gets the number of nodes that depend on this node
/// directly or indirectly</summary>
internal int TotalDependentOnThisCount {
get {
if (totalDependentOnThisCount >= 0)
return totalDependentOnThisCount;
// make a depth-first search to determine the size of the tree of
// projects that depends on this project:
HashSet<BuildNode> visitedNodes = new HashSet<BuildNode>();
VisitDependentOnThis(visitedNodes, this);
totalDependentOnThisCount = visitedNodes.Count;
return totalDependentOnThisCount;
}
}
static void VisitDependentOnThis(HashSet<BuildNode> visitedNodes, BuildNode node)
{
if (visitedNodes.Add(node)) {
foreach (BuildNode n in node.dependentOnThis) {
VisitDependentOnThis(visitedNodes, n);
}
}
}
/// <summary>The list of messages that were not reported because another node held the
/// output lock</summary>
internal List<string> unreportedMessageList;
public BuildNode(BuildEngine engine, IBuildable project)
{
this.engine = engine;
this.project = project;
}
public void ReportError(BuildError error)
{
engine.ReportError(this, error);
}
public void ReportMessage(string message)
{
engine.ReportMessage(this, message);
}
public void Done(bool success)
{
engine.OnBuildFinished(this, success);
}
}
#endregion
#region BuildEngine fields and constructor
readonly Dictionary<IBuildable, BuildNode> nodeDict = new Dictionary<IBuildable, BuildNode>();
readonly BuildOptions options;
List<Solution.ProjectConfigurationPlatformMatching> configMatchings;
BuildNode rootNode;
IBuildable rootProject;
BuildResults results = new BuildResults();
DateTime buildStart;
List<BuildNode> projectsReadyForBuildStart = new List<BuildNode>();
int workersToStart, runningWorkers;
private BuildEngine(BuildOptions options, IBuildable rootProject)
{
this.options = options;
this.rootProject = rootProject;
}
#endregion
#region CreateBuildGraph
BuildNode CreateBuildGraph(IBuildable project)
{
BuildNode node;
if (nodeDict.TryGetValue(project, out node)) {
return node;
}
node = new BuildNode(this, project);
nodeDict[project] = node;
InitializeProjectOptions(node);
InitializeDependencies(node);
node.nodeComplete = true;
return node;
}
void InitializeProjectOptions(BuildNode node)
{
IBuildable project = node.project;
// Create options for building the project
node.options = new ProjectBuildOptions(options.Target);
// find the project configuration
foreach (var matching in configMatchings) {
if (matching.Project == project) {
node.options.Configuration = matching.Configuration;
node.options.Platform = matching.Platform;
}
}
if (string.IsNullOrEmpty(node.options.Configuration))
node.options.Configuration = options.SolutionConfiguration;
if (string.IsNullOrEmpty(node.options.Platform))
node.options.Platform = options.SolutionPlatform;
// copy properties to project options
options.GlobalAdditionalProperties.Foreach(node.options.Properties.Add);
if (project == rootProject) {
foreach (var pair in options.ProjectAdditionalProperties) {
node.options.Properties[pair.Key] = pair.Value;
}
}
}
void InitializeDependencies(BuildNode node)
{
// Initialize dependencies
if (options.BuildDependentProjects) {
var dependencies = node.project.GetBuildDependencies(node.options);
if (dependencies != null) {
node.dependencies = dependencies
.Select<IBuildable, BuildNode>(CreateBuildGraph)
.Distinct().ToArray();
}
}
if (node.dependencies == null) {
node.dependencies = new BuildNode[0];
}
node.outstandingDependencies = node.dependencies.Length;
foreach (BuildNode d in node.dependencies) {
if (!d.nodeComplete)
throw new CyclicDependencyException(node.project, d.project);
d.dependentOnThis.Add(node);
}
if (node.outstandingDependencies == 0) {
projectsReadyForBuildStart.Add(node);
}
}
[Serializable]
sealed class CyclicDependencyException : Exception
{
public IBuildable Project1, Project2;
public CyclicDependencyException()
{
}
public CyclicDependencyException(IBuildable project1, IBuildable project2)
{
this.Project1 = project1;
this.Project2 = project2;
}
}
#endregion
#region Building
void StartBuildProjects()
{
lock (this) {
while (workersToStart > 0) {
if (projectsReadyForBuildStart.Count == 0) {
if (runningWorkers == 0) {
BuildDone();
}
return;
}
workersToStart--;
int projectToStartIndex = 0;
for (int i = 1; i < projectsReadyForBuildStart.Count; i++) {
if (CompareBuildOrder(projectsReadyForBuildStart[i],
projectsReadyForBuildStart[projectToStartIndex]) < 0)
{
projectToStartIndex = i;
}
}
BuildNode node = projectsReadyForBuildStart[projectToStartIndex];
projectsReadyForBuildStart.RemoveAt(projectToStartIndex);
node.buildStarted = true;
bool hasDependencyErrors = false;
foreach (BuildNode n in node.dependencies) {
if (!n.buildFinished)
throw new Exception("Trying to build project with unfinished dependencies");
hasDependencyErrors |= n.hasErrors;
}
ICSharpCode.Core.LoggingService.Debug("Start building " + node.project.Name);
runningWorkers++;
if (hasDependencyErrors) {
ICSharpCode.Core.LoggingService.Debug("Skipped building " + node.project.Name + " (errors in dependencies)");
node.hasErrors = true;
node.Done(false);
} else {
node.project.StartBuild(node.options, node);
}
}
}
}
static int CompareBuildOrder(BuildNode a, BuildNode b)
{
// When the build graph looks like this:
// 1 2
// \ / \
// 3 4
// / \
// 5 6
// And we have 2 build workers, determining the build order alphabetically only would result
// in this order:
// 4, 5
// 6
// 3
// 1, 2
// However, we can build faster if we build 5+6 first:
// 5, 6
// 3, 4
// 1, 2
//
// As heuristic, we first build the projects that have the most projects dependent on it.
int r = -(a.TotalDependentOnThisCount.CompareTo(b.TotalDependentOnThisCount));
if (r == 0)
r = string.Compare(a.project.Name, b.project.Name, StringComparison.CurrentCultureIgnoreCase);
return r;
}
void OnBuildFinished(BuildNode node, bool success)
{
ICSharpCode.Core.LoggingService.Debug("Finished building " + node.project.Name);
lock (this) {
if (node.buildFinished) {
throw new InvalidOperationException("This node already finished building, do not call IBuildFeedbackSink.Done() multiple times!");
}
runningWorkers--;
node.buildFinished = true;
node.hasErrors = !success;
foreach (BuildNode n in node.dependentOnThis) {
n.outstandingDependencies--;
if (n.outstandingDependencies == 0)
projectsReadyForBuildStart.Add(n);
}
workersToStart++;
}
LogBuildFinished(node);
StartBuildProjects();
}
bool buildIsDone;
void BuildDone()
{
lock (this) {
if (buildIsDone)
return;
buildIsDone = true;
}
foreach (BuildNode n in nodeDict.Values) {
if (!n.buildFinished) {
throw new Exception("All workers done, but a project did not finish building");
}
}
string buildTime = " (" + (DateTime.Now - buildStart).ToString() + ")";
if (rootNode.hasErrors) {
results.Result = BuildResultCode.Error;
ReportMessageInternal("${res:MainWindow.CompilerMessages.BuildFailed}" + buildTime);
//StatusBarService.SetMessage("${res:MainWindow.CompilerMessages.BuildFailed}");
} else {
results.Result = BuildResultCode.Success;
ReportMessageInternal("${res:MainWindow.CompilerMessages.BuildFinished}" + buildTime);
//StatusBarService.SetMessage("${res:MainWindow.CompilerMessages.BuildFinished}");
}
if (combinedBuildFeedbackSink != null) {
combinedBuildFeedbackSink.Done(results.Result == BuildResultCode.Success);
}
if (options.Callback != null) {
Gui.WorkbenchSingleton.MainForm.BeginInvoke(options.Callback, results);
}
}
#endregion
#region Logging
IBuildFeedbackSink combinedBuildFeedbackSink;
/// <summary>
/// The node that currently may output messages.
/// To avoid confusing the user in parallel builds, only one project may output messages;
/// the messages from other projects will be enqueued and written to the output as soon
/// as the project holding the lock finishes building.
/// </summary>
BuildNode nodeWithOutputLock;
Queue<BuildNode> nodesWaitingForOutputLock = new Queue<BuildNode>();
void ReportError(BuildNode source, BuildError error)
{
if (!error.IsWarning)
source.hasErrors = true;
results.Add(error);
ReportMessage(source, error.ToString());
if (combinedBuildFeedbackSink != null) {
combinedBuildFeedbackSink.ReportError(error);
}
}
void ReportMessage(BuildNode source, string message)
{
Console.WriteLine(source.project.Name + " reports " + message);
bool hasOutputLock;
lock (this) {
if (nodeWithOutputLock == null) {
nodeWithOutputLock = source;
}
hasOutputLock = nodeWithOutputLock == source;
if (!hasOutputLock) {
if (source.unreportedMessageList == null) {
nodesWaitingForOutputLock.Enqueue(source);
source.unreportedMessageList = new List<string>();
}
source.unreportedMessageList.Add(message);
}
}
if (hasOutputLock) {
ReportMessageInternal(message);
}
}
void LogBuildFinished(BuildNode node)
{
List<string> messagesToReport = null;
bool newNodeWithOutputLockAlreadyFinishedBuilding = false;
lock (this) {
if (node == nodeWithOutputLock) {
if (nodesWaitingForOutputLock.Count > 0) {
nodeWithOutputLock = nodesWaitingForOutputLock.Dequeue();
messagesToReport = nodeWithOutputLock.unreportedMessageList;
nodeWithOutputLock.unreportedMessageList = null;
newNodeWithOutputLockAlreadyFinishedBuilding = nodeWithOutputLock.buildFinished;
} else {
nodeWithOutputLock = null;
}
}
}
if (messagesToReport != null) {
messagesToReport.Foreach(ReportMessageInternal);
}
if (newNodeWithOutputLockAlreadyFinishedBuilding) {
// if the node already finished building before it got the output lock, we need
// to release the output lock again here
LogBuildFinished(nodeWithOutputLock);
}
}
void ReportMessageInternal(string message)
{
if (combinedBuildFeedbackSink != null)
combinedBuildFeedbackSink.ReportMessage(message);
}
#endregion
}
}

96
src/Main/Base/Project/Src/Project/BuildOptions.cs

@ -7,36 +7,106 @@ @@ -7,36 +7,106 @@
using System;
using System.Collections.Generic;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Project
{
public delegate void BuildCallback(BuildResults results);
/// <summary>
/// Specifies options for building a single project.
/// </summary>
public class ProjectBuildOptions
{
BuildTarget target;
IDictionary<string, string> properties = new SortedList<string, string>();
public BuildTarget Target {
get { return target; }
}
public IDictionary<string, string> Properties {
get { return properties; }
}
public ProjectBuildOptions(BuildTarget target)
{
this.target = target;
}
/// <summary>
/// Specifies the project configuration used for the build.
/// </summary>
public string Configuration { get; set; }
/// <summary>
/// Specifies the project platform used for the build.
/// </summary>
public string Platform { get; set; }
}
/// <summary>
/// Specifies options when starting a build.
/// </summary>
public class BuildOptions
{
public static bool ShowErrorListAfterBuild {
get {
return PropertyService.Get("SharpDevelop.ShowErrorListAfterBuild", true);
}
set {
PropertyService.Set("SharpDevelop.ShowErrorListAfterBuild", value);
}
}
public static int DefaultParallelProjectCount {
get {
return PropertyService.Get("SharpDevelop.BuildParallelProjectCount", Environment.ProcessorCount);
}
set {
PropertyService.Set("SharpDevelop.BuildParallelProjectCount", value);
}
}
BuildCallback callback;
BuildTarget target;
IDictionary<string, string> additionalProperties;
IDictionary<string, string> globalAdditionalProperties = new SortedList<string, string>();
IDictionary<string, string> projectAdditionalProperties = new SortedList<string, string>();
public BuildOptions()
{
this.target = BuildTarget.Build;
}
/// <summary>
/// Specifies whether dependencies should be built.
/// </summary>
public bool BuildDependentProjects { get; set; }
/// <summary>
/// Specifies the solution configuration used for the build.
/// </summary>
public string SolutionConfiguration { get; set; }
/// <summary>
/// Specifies the solution platform used for the build.
/// </summary>
public string SolutionPlatform { get; set; }
/// <summary>
/// Specifies the number of projects that should be built in parallel.
/// </summary>
public int ParallelProjectCount { get; set; }
public BuildOptions(BuildTarget target, BuildCallback callback)
{
this.callback = callback;
this.target = target;
this.BuildDependentProjects = true;
this.ParallelProjectCount = DefaultParallelProjectCount;
}
public BuildOptions(BuildTarget target, BuildCallback callback, IDictionary<string, string> additionalProperties)
public BuildOptions(BuildTarget target, BuildCallback callback, IDictionary<string, string> projectAdditionalProperties)
: this(target, callback)
{
this.callback = callback;
this.target = target;
this.additionalProperties = additionalProperties;
if (projectAdditionalProperties == null)
throw new ArgumentNullException("projectAdditionalProperties");
this.projectAdditionalProperties = projectAdditionalProperties;
}
public BuildCallback Callback {
@ -47,8 +117,12 @@ namespace ICSharpCode.SharpDevelop.Project @@ -47,8 +117,12 @@ namespace ICSharpCode.SharpDevelop.Project
get { return target; }
}
public IDictionary<string, string> AdditionalProperties {
get { return additionalProperties; }
public IDictionary<string, string> GlobalAdditionalProperties {
get { return globalAdditionalProperties; }
}
public IDictionary<string, string> ProjectAdditionalProperties {
get { return projectAdditionalProperties; }
}
}
}

36
src/Main/Base/Project/Src/Project/IBuildFeedbackSink.cs

@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
namespace ICSharpCode.SharpDevelop.Project
{
/// <summary>
/// Interface for reporting build results in real-time.
/// </summary>
public interface IBuildFeedbackSink
{
/// <summary>
/// Reports an build error by adding it to the error list.
/// This member is thread-safe.
/// </summary>
void ReportError(BuildError error);
/// <summary>
/// Reports a build message.
/// This member is thread-safe.
/// </summary>
void ReportMessage(string message);
/// <summary>
/// Notifies the build engine that the build of a project has finished.
/// You sould not call any methods after the Done() call.
/// This member is thread-safe.
/// </summary>
void Done(bool success);
}
}

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

@ -22,7 +22,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -22,7 +22,7 @@ namespace ICSharpCode.SharpDevelop.Project
/// When you implement IProject, you should also implement IProjectItemListProvider and IProjectAllowChangeConfigurations
/// </summary>
public interface IProject
: ISolutionFolder, IDisposable, IMementoCapable
: IBuildable, ISolutionFolder, IDisposable, IMementoCapable
{
/// <summary>
/// Gets the list of items in the project. This member is thread-safe.
@ -202,11 +202,6 @@ namespace ICSharpCode.SharpDevelop.Project @@ -202,11 +202,6 @@ namespace ICSharpCode.SharpDevelop.Project
/// </summary>
ParseProjectContent CreateProjectContent();
/// <summary>
/// Starts building the project using the specified options.
/// </summary>
void StartBuild(BuildOptions options);
/// <summary>
/// Creates a new ProjectItem for the passed MSBuild item.
/// </summary>
@ -224,6 +219,23 @@ namespace ICSharpCode.SharpDevelop.Project @@ -224,6 +219,23 @@ namespace ICSharpCode.SharpDevelop.Project
void ResolveAssemblyReferences();
}
/// <summary>
/// A project or solution.
/// </summary>
public interface IBuildable : ISolutionFolder
{
/// <summary>
/// Gets the list of projects on which this project depends.
/// </summary>
ICollection<IBuildable> GetBuildDependencies(ProjectBuildOptions buildOptions);
/// <summary>
/// Starts building the project using the specified options.
/// This member must be implemented thread-safe.
/// </summary>
void StartBuild(ProjectBuildOptions buildOptions, IBuildFeedbackSink feedbackSink);
}
/// <summary>
/// Interface for adding and removing items from a project. Not part of the IProject
/// interface because in nearly all cases, ProjectService.Add/RemoveProjectItem should

14
src/Main/Base/Project/Src/Project/MSBuildAdditionalLogger.cs

@ -16,7 +16,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -16,7 +16,7 @@ namespace ICSharpCode.SharpDevelop.Project
/// </summary>
public interface IMSBuildAdditionalLogger
{
ILogger CreateLogger(MSBuildEngineWorker engineWorker);
ILogger CreateLogger(MSBuildEngine engine);
}
/// <summary>
@ -67,23 +67,23 @@ namespace ICSharpCode.SharpDevelop.Project @@ -67,23 +67,23 @@ namespace ICSharpCode.SharpDevelop.Project
addIn = codon.AddIn;
}
public ILogger CreateLogger(MSBuildEngineWorker engineWorker)
public ILogger CreateLogger(MSBuildEngine engine)
{
return new TaskBoundAdditionalLogger(this, engineWorker);
return new TaskBoundAdditionalLogger(this, engine);
}
}
private class TaskBoundAdditionalLogger : ILogger
{
TaskBoundAdditionalLoggerDescriptor desc;
MSBuildEngineWorker engineWorker;
MSBuildEngine engine;
ILogger baseLogger;
bool isActive;
public TaskBoundAdditionalLogger(TaskBoundAdditionalLoggerDescriptor desc, MSBuildEngineWorker engineWorker)
public TaskBoundAdditionalLogger(TaskBoundAdditionalLoggerDescriptor desc, MSBuildEngine engine)
{
this.desc = desc;
this.engineWorker = engineWorker;
this.engine = engine;
}
void CreateBaseLogger()
@ -93,7 +93,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -93,7 +93,7 @@ namespace ICSharpCode.SharpDevelop.Project
baseLogger = obj as ILogger;
IMSBuildAdditionalLogger addLog = obj as IMSBuildAdditionalLogger;
if (addLog != null) {
baseLogger = addLog.CreateLogger(engineWorker);
baseLogger = addLog.CreateLogger(engine);
}
}
}

22
src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs

@ -816,24 +816,34 @@ namespace ICSharpCode.SharpDevelop.Project @@ -816,24 +816,34 @@ namespace ICSharpCode.SharpDevelop.Project
#endregion
#region Building
public override void StartBuild(BuildOptions options)
public override ICollection<IBuildable> GetBuildDependencies(ProjectBuildOptions buildOptions)
{
RunMSBuild(this.ParentSolution, this,
this.ParentSolution.Preferences.ActiveConfiguration,
this.ParentSolution.Preferences.ActivePlatform,
options);
ICollection<IBuildable> result = base.GetBuildDependencies(buildOptions);
foreach (ProjectItem item in GetItemsOfType(ItemType.ProjectReference)) {
ProjectReferenceProjectItem prpi = item as ProjectReferenceProjectItem;
if (prpi != null && prpi.ReferencedProject != null)
result.Add(prpi.ReferencedProject);
}
return result;
}
public override void StartBuild(ProjectBuildOptions options, IBuildFeedbackSink feedbackSink)
{
MSBuildEngine.Build(this, options, feedbackSink);
}
/*
internal static void RunMSBuild(Solution solution, IProject project,
string configuration, string platform, BuildOptions options)
{
WorkbenchSingleton.Workbench.GetPad(typeof(CompilerMessageView)).BringPadToFront();
MSBuildEngine engine = new MSBuildEngine();
oldMSBuildEngine engine = new oldMSBuildEngine();
engine.Configuration = configuration;
engine.Platform = platform;
engine.MessageView = TaskService.BuildMessageViewCategory;
engine.Run(solution, project, options);
}
*/
#endregion
#region Loading

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

@ -16,6 +16,7 @@ using ICSharpCode.Core; @@ -16,6 +16,7 @@ using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui;
using Microsoft.Build.BuildEngine;
using Microsoft.Build.Framework;
using ICSharpCode.SharpDevelop.BuildWorker;
namespace ICSharpCode.SharpDevelop.Project
{
@ -73,479 +74,241 @@ namespace ICSharpCode.SharpDevelop.Project @@ -73,479 +74,241 @@ namespace ICSharpCode.SharpDevelop.Project
MSBuildProperties.Add("BuildingInsideVisualStudio", "true");
}
#region Properties
MessageViewCategory messageView;
public static void Build(IProject project, ProjectBuildOptions options, IBuildFeedbackSink feedbackSink)
{
if (project == null)
throw new ArgumentNullException("project");
if (options == null)
throw new ArgumentNullException("options");
if (feedbackSink == null)
throw new ArgumentNullException("feedbackSink");
MSBuildEngine engine = new MSBuildEngine(project, options, feedbackSink);
engine.StartBuild();
}
/// <summary>
/// The <see cref="MessageViewCategory"/> the output is written to.
/// </summary>
public MessageViewCategory MessageView {
get {
return messageView;
IProject project;
ProjectBuildOptions options;
IBuildFeedbackSink feedbackSink;
private MSBuildEngine(IProject project, ProjectBuildOptions options, IBuildFeedbackSink feedbackSink)
{
this.project = project;
this.options = options;
this.feedbackSink = feedbackSink;
}
void StartBuild()
{
WorkerManager.ShowError = MessageService.ShowError;
BuildWorker.BuildSettings settings = new BuildWorker.BuildSettings();
SharpDevelopLogger logger = new SharpDevelopLogger(this);
settings.Logger.Add(logger);
foreach (IMSBuildAdditionalLogger loggerProvider in MSBuildEngine.AdditionalMSBuildLoggers) {
settings.Logger.Add(loggerProvider.CreateLogger(this));
}
set {
messageView = value;
BuildJob job = new BuildJob();
job.ProjectFileName = project.FileName;
BuildPropertyGroup pg = new BuildPropertyGroup();
MSBuildBasedProject.InitializeMSBuildProjectProperties(pg);
foreach (BuildProperty p in pg) {
job.Properties[p.Name] = p.FinalValue;
}
Solution solution = project.ParentSolution;
job.Properties["SolutionDir"] = EnsureBackslash(solution.Directory);
job.Properties["SolutionExt"] = ".sln";
job.Properties["SolutionFileName"] = Path.GetFileName(solution.FileName);
job.Properties["SolutionPath"] = solution.FileName;
foreach (var pair in options.Properties) {
job.Properties[pair.Key] = pair.Value;
}
job.Properties["Configuration"] = options.Configuration;
if (options.Platform == "Any CPU")
job.Properties["Platform"] = "AnyCPU";
else
job.Properties["Platform"] = options.Platform;
job.Target = options.Target.TargetName;
bool buildInProcess = false;
if (Interlocked.CompareExchange(ref isBuildingInProcess, 1, 0) == 0) {
buildInProcess = true;
}
if (buildInProcess) {
settings.BuildDoneCallback = delegate(bool success) {
if (Interlocked.Exchange(ref isBuildingInProcess, 0) != 1) {
MessageService.ShowError("isBuildingInProcess should have been 1!");
}
logger.FlushCurrentError();
feedbackSink.Done(success);
};
Thread thread = new Thread(new ThreadStart(
delegate {
lock (MSBuildInternals.InProcessMSBuildLock) {
WorkerManager.RunBuildInProcess(job, settings);
}
}));
thread.Name = "InProcess build thread";
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
} else {
settings.BuildDoneCallback = delegate(bool success) {
logger.FlushCurrentError();
feedbackSink.Done(success);
};
WorkerManager.StartBuild(job, settings);
}
}
static int isBuildingInProcess;
static string EnsureBackslash(string path)
{
if (path.EndsWith("\\"))
return path;
else
return path + "\\";
}
string configuration;
BuildError currentErrorOrWarning;
/// <summary>
/// The configuration of the solution or project that should be builded.
/// Use null to build the default configuration.
/// Gets the last build error/warning created by the default
/// SharpDevelop logger.
/// </summary>
public string Configuration {
public BuildError CurrentErrorOrWarning {
get {
return configuration;
}
set {
configuration = value;
return currentErrorOrWarning;
}
}
string platform;
Stack<string> projectFiles = new Stack<string>();
/// <summary>
/// The platform of the solution or project that should be builded.
/// Use null to build the default platform.
/// Gets the name of the currently building project file.
/// </summary>
public string Platform {
public string CurrentProjectFile {
get {
return platform;
}
set {
platform = value;
if (projectFiles.Count == 0)
return null;
else
return projectFiles.Peek();
}
}
#endregion
volatile static bool isRunning = false;
public void OutputText(string message)
{
feedbackSink.ReportMessage(message);
}
public void Run(Solution solution, IProject project, BuildOptions options)
public void ReportError(BuildError error)
{
if (isRunning) {
BuildResults results = new BuildResults();
results.Result = BuildResultCode.MSBuildAlreadyRunning;
results.Add(new BuildError(null, ResourceService.GetString("MainWindow.CompilerMessages.MSBuildAlreadyRunning")));
if (options.Callback != null) {
options.Callback(results);
}
} else {
isRunning = true;
Thread thread = new Thread(new BuildRun(solution, project, options, this).RunMainBuild);
thread.Name = "MSBuildEngine main worker";
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
feedbackSink.ReportError(error);
}
internal sealed class BuildRun
class SharpDevelopLogger : ILogger
{
Solution solution;
IProject project;
BuildOptions options;
MSBuildEngine parentEngine;
internal BuildResults currentResults = new BuildResults();
List<ProjectToBuild> projectsToBuild = new List<ProjectToBuild>();
MSBuildEngine worker;
public BuildRun(Solution solution, IProject project, BuildOptions options, MSBuildEngine parentEngine)
public SharpDevelopLogger(MSBuildEngine engine)
{
this.solution = solution;
this.project = project;
this.options = options;
this.parentEngine = parentEngine;
this.worker = engine;
}
#region Main Build
[STAThread]
internal void RunMainBuild()
void AppendText(string text)
{
try {
PrepareBuild();
if (MSBuildEngine.isRunning) {
StartWorkerBuild();
}
} catch (Exception ex) {
MessageService.ShowError(ex);
}
worker.OutputText(text);
}
void Finish()
internal void FlushCurrentError()
{
LoggingService.Debug("MSBuild finished");
MSBuildEngine.isRunning = false;
if (currentResults.Result == BuildResultCode.None) {
currentResults.Result = BuildResultCode.Success;
}
if (currentResults.Result == BuildResultCode.Success) {
parentEngine.MessageView.AppendLine("${res:MainWindow.CompilerMessages.BuildFinished}");
StatusBarService.SetMessage("${res:MainWindow.CompilerMessages.BuildFinished}");
} else {
parentEngine.MessageView.AppendLine("${res:MainWindow.CompilerMessages.BuildFailed}");
StatusBarService.SetMessage("${res:MainWindow.CompilerMessages.BuildFailed}");
}
if (options.Callback != null) {
WorkbenchSingleton.MainForm.BeginInvoke(options.Callback, currentResults);
if (worker.currentErrorOrWarning != null) {
worker.ReportError(worker.currentErrorOrWarning);
worker.currentErrorOrWarning = null;
}
}
void PrepareBuild()
void OnProjectStarted(object sender, ProjectStartedEventArgs e)
{
parentEngine.MessageView.AppendLine("${res:MainWindow.CompilerMessages.BuildStarted}");
// first parse the solution file into a MSBuild project
LoggingService.Debug("Parsing solution file " + solution.FileName);
Engine engine = CreateEngine();
if (parentEngine.Configuration != null) {
engine.GlobalProperties.SetProperty("Configuration", parentEngine.Configuration);
}
if (parentEngine.Platform != null) {
engine.GlobalProperties.SetProperty("Platform", parentEngine.Platform);
}
Project solutionProject = LoadProject(engine, solution.FileName);
if (solutionProject == null) {
Finish();
return;
}
// get the projects that should be built
IEnumerable<IProject> projectsToBuildWithoutDependencies;
if (project == null)
projectsToBuildWithoutDependencies = solution.Projects;
else
projectsToBuildWithoutDependencies = GetAllReferencedProjects(project);
projectsToBuild = (from p in projectsToBuildWithoutDependencies
select new ProjectToBuild(p.FileName, options.Target.TargetName)).ToList();
Dictionary<string, ProjectToBuild> projectDict = new Dictionary<string, ProjectToBuild>(StringComparer.InvariantCultureIgnoreCase);
foreach (ProjectToBuild ptb in projectsToBuild) {
projectDict[ptb.file] = ptb;
}
// use the information from the parsed solution file to determine build level, configuration and
// platform of the projects to build
for (int level = 0;; level++) {
BuildItemGroup group = solutionProject.GetEvaluatedItemsByName("BuildLevel" + level);
if (group.Count == 0)
break;
foreach (BuildItem item in group) {
string path = FileUtility.GetAbsolutePath(solution.Directory, item.Include);
ProjectToBuild ptb;
if (projectDict.TryGetValue(path, out ptb)) {
ptb.level = level;
ptb.configuration = item.GetEvaluatedMetadata("Configuration");
ptb.platform = item.GetEvaluatedMetadata("Platform");
} else {
// don't warn when compiling a specific project, but simply ignore projects
// that are not required
if (project == null) {
parentEngine.MessageView.AppendLine("Cannot build project file: " + path + " (project is not loaded by SharpDevelop)");
}
}
}
}
projectsToBuild.Sort(
delegate(ProjectToBuild ptb1, ProjectToBuild ptb2) {
if (ptb1.level == ptb2.level) {
return Path.GetFileName(ptb1.file).CompareTo(Path.GetFileName(ptb2.file));
} else {
return ptb1.level.CompareTo(ptb2.level);
}
});
bool noProjectsToBuild = true;
for (int i = 0; i < projectsToBuild.Count; i++) {
if (projectsToBuild[i].level < 0) {
parentEngine.MessageView.AppendLine("Skipping " + Path.GetFileName(projectsToBuild[i].file));
} else {
noProjectsToBuild = false;
break;
}
}
if (noProjectsToBuild) {
parentEngine.MessageView.AppendLine("There are no projects to build.");
Finish();
}
worker.projectFiles.Push(e.ProjectFile);
}
#endregion
#region Worker build
int workerCount;
int maxWorkerCount;
/// <summary>
/// Runs the first worker on this thread and creates new threads if required
/// </summary>
void StartWorkerBuild()
void OnProjectFinished(object sender, ProjectFinishedEventArgs e)
{
workerCount = 1;
// one build worker thread is maximum - MSBuild sets the working directory
// and thus cannot run multiple times in the same process
maxWorkerCount = 1;
RunWorkerBuild();
FlushCurrentError();
worker.projectFiles.Pop();
}
// Reuse worker objects: improves performance because MSBuild can cache Xml documents
Queue<MSBuildEngineWorker> unusedWorkers = new Queue<MSBuildEngineWorker>();
string activeTaskName;
/// <summary>
/// Runs one worker thread
/// </summary>
[STAThread]
void RunWorkerBuild()
void OnTaskStarted(object sender, TaskStartedEventArgs e)
{
LoggingService.Debug("Build Worker thread started");
MSBuildEngineWorker worker = null;
try {
lock (projectsToBuild) {
if (unusedWorkers.Count > 0)
worker = unusedWorkers.Dequeue();
}
if (worker == null) {
worker = new MSBuildEngineWorker(parentEngine, this);
}
while (RunWorkerInternal(worker));
} catch (Exception ex) {
MessageService.ShowError(ex);
} finally {
bool wasLastWorker;
lock (projectsToBuild) {
workerCount--;
wasLastWorker = workerCount == 0;
if (worker != null) {
unusedWorkers.Enqueue(worker);
}
}
LoggingService.Debug("Build Worker thread finished");
if (wasLastWorker) {
Finish();
}
activeTaskName = e.TaskName;
if (MSBuildEngine.CompileTaskNames.Contains(e.TaskName.ToLowerInvariant())) {
AppendText("${res:MainWindow.CompilerMessages.CompileVerb} " + Path.GetFileNameWithoutExtension(e.ProjectFile));
}
}
int lastUniqueWorkerID;
int currentBuildLevel;
/// <summary>
/// Find available work and run it on the specified worker.
/// </summary>
bool RunWorkerInternal(MSBuildEngineWorker worker)
void OnTaskFinished(object sender, TaskFinishedEventArgs e)
{
ProjectToBuild nextFreeProject = null;
lock (projectsToBuild) {
foreach (ProjectToBuild ptb in projectsToBuild) {
if (ptb.buildStarted == false && ptb.level == currentBuildLevel) {
if (nextFreeProject == null) {
nextFreeProject = ptb;
// all workers busy, don't look if there is more work available
if (workerCount == maxWorkerCount)
break;
} else {
// free workers available + additional work available:
// start a new worker
LoggingService.Debug("Starting a new worker");
workerCount++;
Thread thread = new Thread(RunWorkerBuild);
thread.Name = "MSBuildEngine worker " + (++lastUniqueWorkerID);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
// start at most one additional worker, the new worker can
// start more threads if desired
break;
}
}
}
if (nextFreeProject == null) {
// are all projects on the current level done?
bool allDone = true;
foreach (ProjectToBuild ptb in projectsToBuild) {
if (ptb.level == currentBuildLevel) {
if (!ptb.buildFinished) {
allDone = false;
break;
}
}
}
if (allDone) {
currentBuildLevel++;
if (currentBuildLevel > projectsToBuild[projectsToBuild.Count - 1].level) {
return false;
}
return true;
} else {
// nothing to do for this worker thread
return false;
}
}
// now build nextFreeProject
nextFreeProject.buildStarted = true;
} // end lock
StatusBarService.SetMessage("${res:MainWindow.CompilerMessages.BuildVerb} " + Path.GetFileNameWithoutExtension(nextFreeProject.file) + "...");
// run the build:
if (worker.Build(nextFreeProject)) {
// build successful: mark it as finished
lock (projectsToBuild) {
nextFreeProject.buildFinished = true;
}
}
return true;
FlushCurrentError();
}
#endregion
#region Managing the output lock
/// <summary>
/// Queue of output text to write when lock is released.
///
/// Also serves as object to ensure access to outputLockIsAquired is thread-safe.
/// </summary>
Queue<string> queuedOutputText = new Queue<string>();
volatile bool outputLockIsAquired;
internal bool TryAquireOutputLock()
void OnError(object sender, BuildErrorEventArgs e)
{
lock (queuedOutputText) {
if (outputLockIsAquired) {
return false;
} else {
outputLockIsAquired = true;
return true;
}
}
AppendError(e.File, e.LineNumber, e.ColumnNumber, e.Code, e.Message, false);
}
internal void ReleaseOutputLock()
void OnWarning(object sender, BuildWarningEventArgs e)
{
lock (queuedOutputText) {
outputLockIsAquired = false;
while (queuedOutputText.Count > 0) {
parentEngine.MessageView.AppendText(queuedOutputText.Dequeue());
}
}
AppendError(e.File, e.LineNumber, e.ColumnNumber, e.Code, e.Message, true);
}
internal void EnqueueTextForAppendWhenOutputLockIsReleased(string text)
void AppendError(string file, int lineNumber, int columnNumber, string code, string message, bool isWarning)
{
lock (queuedOutputText) {
if (outputLockIsAquired) {
queuedOutputText.Enqueue(text);
} else {
parentEngine.MessageView.AppendText(text);
if (string.Equals(file, activeTaskName, StringComparison.InvariantCultureIgnoreCase)) {
file = "";
} else if (FileUtility.IsValidPath(file)) {
bool isShortFileName = file == Path.GetFileNameWithoutExtension(file);
if (worker.CurrentProjectFile != null) {
file = Path.Combine(Path.GetDirectoryName(worker.CurrentProjectFile), file);
}
}
}
#endregion
#region CreateEngine / LoadProject
internal Engine CreateEngine()
{
Engine engine = MSBuildInternals.CreateEngine();
MSBuildBasedProject.InitializeMSBuildProjectProperties(engine.GlobalProperties);
if (options.AdditionalProperties != null) {
foreach (KeyValuePair<string, string> entry in options.AdditionalProperties) {
engine.GlobalProperties.SetProperty(entry.Key, entry.Value);
if (isShortFileName && !File.Exists(file)) {
file = "";
}
}
engine.GlobalProperties.SetProperty("SolutionDir", EnsureBackslash(solution.Directory));
engine.GlobalProperties.SetProperty("SolutionExt", ".sln");
engine.GlobalProperties.SetProperty("SolutionFileName", Path.GetFileName(solution.FileName));
engine.GlobalProperties.SetProperty("SolutionPath", solution.FileName);
return engine;
FlushCurrentError();
BuildError error = new BuildError(file, lineNumber, columnNumber, code, message);
error.IsWarning = isWarning;
worker.currentErrorOrWarning = error;
}
static string EnsureBackslash(string path)
{
if (path.EndsWith("\\"))
return path;
else
return path + "\\";
}
#region ILogger interface implementation
public LoggerVerbosity Verbosity { get; set; }
public string Parameters { get; set; }
internal Project LoadProject(Engine engine, string fileName)
public void Initialize(IEventSource eventSource)
{
Project project = engine.CreateNewProject();
try {
project.Load(fileName);
// When we set BuildingInsideVisualStudio, MSBuild tries to build all projects
// every time because in Visual Studio, the host compiler does the change detection
// We override the property '_ComputeNonExistentFileProperty' which is responsible
// for recompiling each time - our _ComputeNonExistentFileProperty does nothing,
// which re-enables the MSBuild's usual change detection
project.Targets.AddNewTarget("_ComputeNonExistentFileProperty");
return project;
} catch (ArgumentException ex) {
currentResults.Result = BuildResultCode.BuildFileError;
currentResults.Add(new BuildError("", ex.Message));
} catch (InvalidProjectFileException ex) {
currentResults.Result = BuildResultCode.BuildFileError;
currentResults.Add(new BuildError(ex.ProjectFile, ex.LineNumber, ex.ColumnNumber, ex.ErrorCode, ex.Message));
}
return null;
eventSource.ProjectStarted += new ProjectStartedEventHandler(OnProjectStarted);
eventSource.ProjectFinished += new ProjectFinishedEventHandler(OnProjectFinished);
eventSource.TaskStarted += new TaskStartedEventHandler(OnTaskStarted);
eventSource.TaskFinished += new TaskFinishedEventHandler(OnTaskFinished);
eventSource.ErrorRaised += new BuildErrorEventHandler(OnError);
eventSource.WarningRaised += new BuildWarningEventHandler(OnWarning);
}
#endregion
#region GetAllReferencedProjects
/// <summary>
/// Gets all projects referenced by the project.
/// </summary>
static ICollection<IProject> GetAllReferencedProjects(IProject project)
public void Shutdown()
{
HashSet<IProject> referencedProjects = new HashSet<IProject>();
Stack<IProject> stack = new Stack<IProject>();
referencedProjects.Add(project);
stack.Push(project);
while (stack.Count != 0) {
project = stack.Pop();
foreach (ProjectItem item in project.GetItemsOfType(ItemType.ProjectReference)) {
ProjectReferenceProjectItem prpi = item as ProjectReferenceProjectItem;
if (prpi != null) {
if (referencedProjects.Add(prpi.ReferencedProject)) {
stack.Push(prpi.ReferencedProject);
}
}
}
}
return referencedProjects;
}
#endregion
}
internal sealed class ProjectToBuild
{
internal string file;
internal int level = -1;
internal string configuration;
internal string platform;
internal string targets;
// build status. Three possible values:
// buildStarted=buildFinished=false => build not yet started
// buildStarted=true, buildFinished=false => build running
// buildStarted=buildFinished=true => build finished
internal bool buildStarted;
internal bool buildFinished;
internal ProjectToBuild(string file, string targets)
{
this.file = file;
this.targets = targets;
}
}
}
}

253
src/Main/Base/Project/Src/Project/MSBuildEngineWorker.cs

@ -1,253 +0,0 @@ @@ -1,253 +0,0 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Text;
using System.Collections.Generic;
using Microsoft.Build.Framework;
using Microsoft.Build.BuildEngine;
using ICSharpCode.SharpDevelop.Gui;
using System.IO;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Project
{
public sealed class MSBuildEngineWorker
{
MSBuildEngine parentEngine;
MSBuildEngine.BuildRun buildRun;
Engine engine;
SharpDevelopLogger logger;
internal MSBuildEngineWorker(MSBuildEngine parentEngine, MSBuildEngine.BuildRun buildRun)
{
this.parentEngine = parentEngine;
this.buildRun = buildRun;
engine = buildRun.CreateEngine();
logger = new SharpDevelopLogger(this);
engine.RegisterLogger(logger);
foreach (IMSBuildAdditionalLogger loggerProvider in MSBuildEngine.AdditionalMSBuildLoggers) {
engine.RegisterLogger(loggerProvider.CreateLogger(this));
}
}
internal bool Build(MSBuildEngine.ProjectToBuild ptb)
{
LoggingService.Debug("Run MSBuild on " + ptb.file);
if (!string.IsNullOrEmpty(ptb.configuration)) {
engine.GlobalProperties.SetProperty("Configuration", ptb.configuration);
}
if (!string.IsNullOrEmpty(ptb.platform)) {
engine.GlobalProperties.SetProperty("Platform", ptb.platform);
}
bool success;
lock (MSBuildInternals.InProcessMSBuildLock) {
Microsoft.Build.BuildEngine.Project project = buildRun.LoadProject(engine, ptb.file);
if (project == null) {
LoggingService.Debug("Error loading " + ptb.file);
return false;
}
foreach (string additionalTargetFile in MSBuildEngine.AdditionalTargetFiles) {
project.AddNewImport(additionalTargetFile, null);
}
if (string.IsNullOrEmpty(ptb.targets)) {
success = engine.BuildProject(project);
} else {
success = engine.BuildProject(project, ptb.targets.Split(';'));
}
}
logger.FlushCurrentError();
ReleaseOutput();
LoggingService.Debug("MSBuild on " + ptb.file + " finished " + (success ? "successfully" : "with error"));
return success;
}
bool outputAcquired;
StringBuilder cachedOutput;
public void OutputText(string text)
{
if (outputAcquired == false && cachedOutput == null) {
outputAcquired = buildRun.TryAquireOutputLock();
if (!outputAcquired) {
cachedOutput = new StringBuilder();
}
}
if (outputAcquired) {
parentEngine.MessageView.AppendText(text);
} else {
cachedOutput.Append(text);
}
}
void ReleaseOutput()
{
if (cachedOutput != null) {
buildRun.EnqueueTextForAppendWhenOutputLockIsReleased(cachedOutput.ToString());
cachedOutput = null;
}
if (outputAcquired) {
buildRun.ReleaseOutputLock();
}
}
#region CurrentBuild properties
BuildError currentErrorOrWarning;
/// <summary>
/// Gets the last build error/warning created by the default
/// SharpDevelop logger.
/// </summary>
public BuildError CurrentErrorOrWarning {
get {
return currentErrorOrWarning;
}
}
Stack<string> projectFiles = new Stack<string>();
/// <summary>
/// Gets the name of the currently building project file.
/// </summary>
public string CurrentProjectFile {
get {
if (projectFiles.Count == 0)
return null;
else
return projectFiles.Peek();
}
}
#endregion
class SharpDevelopLogger : ILogger
{
MSBuildEngineWorker worker;
BuildResults results;
public SharpDevelopLogger(MSBuildEngineWorker worker)
{
this.worker = worker;
this.results = worker.buildRun.currentResults;
}
void AppendText(string text)
{
worker.OutputText(text + "\r\n");
}
internal void FlushCurrentError()
{
if (worker.currentErrorOrWarning != null) {
AppendText(worker.currentErrorOrWarning.ToString());
worker.currentErrorOrWarning = null;
}
}
void OnProjectStarted(object sender, ProjectStartedEventArgs e)
{
worker.projectFiles.Push(e.ProjectFile);
}
void OnProjectFinished(object sender, ProjectFinishedEventArgs e)
{
FlushCurrentError();
worker.projectFiles.Pop();
}
string activeTaskName;
void OnTaskStarted(object sender, TaskStartedEventArgs e)
{
activeTaskName = e.TaskName;
if (MSBuildEngine.CompileTaskNames.Contains(e.TaskName.ToLowerInvariant())) {
AppendText("${res:MainWindow.CompilerMessages.CompileVerb} " + Path.GetFileNameWithoutExtension(e.ProjectFile));
}
}
void OnTaskFinished(object sender, TaskFinishedEventArgs e)
{
FlushCurrentError();
}
void OnError(object sender, BuildErrorEventArgs e)
{
AppendError(e.File, e.LineNumber, e.ColumnNumber, e.Code, e.Message, false);
}
void OnWarning(object sender, BuildWarningEventArgs e)
{
AppendError(e.File, e.LineNumber, e.ColumnNumber, e.Code, e.Message, true);
}
void AppendError(string file, int lineNumber, int columnNumber, string code, string message, bool isWarning)
{
if (string.Equals(file, activeTaskName, StringComparison.InvariantCultureIgnoreCase)) {
file = "";
} else if (FileUtility.IsValidPath(file)) {
bool isShortFileName = file == Path.GetFileNameWithoutExtension(file);
if (worker.CurrentProjectFile != null) {
file = Path.Combine(Path.GetDirectoryName(worker.CurrentProjectFile), file);
}
if (isShortFileName && !File.Exists(file)) {
file = "";
}
}
FlushCurrentError();
BuildError error = new BuildError(file, lineNumber, columnNumber, code, message);
error.IsWarning = isWarning;
results.Add(error);
worker.currentErrorOrWarning = error;
}
#region ILogger interface implementation
LoggerVerbosity verbosity = LoggerVerbosity.Minimal;
public LoggerVerbosity Verbosity {
get {
return verbosity;
}
set {
verbosity = value;
}
}
string parameters;
public string Parameters {
get {
return parameters;
}
set {
parameters = value;
}
}
public void Initialize(IEventSource eventSource)
{
eventSource.ProjectStarted += new ProjectStartedEventHandler(OnProjectStarted);
eventSource.ProjectFinished += new ProjectFinishedEventHandler(OnProjectFinished);
eventSource.TaskStarted += new TaskStartedEventHandler(OnTaskStarted);
eventSource.TaskFinished += new TaskFinishedEventHandler(OnTaskFinished);
eventSource.ErrorRaised += new BuildErrorEventHandler(OnError);
eventSource.WarningRaised += new BuildWarningEventHandler(OnWarning);
}
public void Shutdown()
{
}
#endregion
}
}
}

30
src/Main/Base/Project/Src/Project/MSBuildFileProject.cs

@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
using System;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Project
{
/// <summary>
/// A project that is not a real project, but a MSBuild file included as project.
/// </summary>
public class MSBuildFileProject : AbstractProject
{
public MSBuildFileProject(string fileName, string title)
{
Name = title;
FileName = fileName;
TypeGuid = "{00000000-0000-0000-0000-000000000000}";
}
public override void StartBuild(ProjectBuildOptions options, IBuildFeedbackSink feedbackSink)
{
MSBuildEngine.Build(this, options, feedbackSink);
}
}
}

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

@ -26,7 +26,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -26,7 +26,7 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
public class Solution : SolutionFolder, IDisposable, IMSBuildEngineProvider
public class Solution : SolutionFolder, IDisposable, IMSBuildEngineProvider, IBuildable
{
/// <summary>contains <guid>, (IProject/ISolutionFolder) pairs.</summary>
Dictionary<string, ISolutionFolder> guidDictionary = new Dictionary<string, ISolutionFolder>();
@ -1142,12 +1142,20 @@ namespace ICSharpCode.SharpDevelop.Project @@ -1142,12 +1142,20 @@ namespace ICSharpCode.SharpDevelop.Project
}
#endregion
public void StartBuild(BuildOptions options)
#region Building
ICollection<IBuildable> IBuildable.GetBuildDependencies(ProjectBuildOptions buildOptions)
{
MSBuildBasedProject.RunMSBuild(this, null,
this.Preferences.ActiveConfiguration,
this.Preferences.ActivePlatform,
options);
List<IBuildable> result = new List<IBuildable>();
foreach (IProject p in this.Projects)
result.Add(p);
return result;
}
void IBuildable.StartBuild(ProjectBuildOptions buildOptions, IBuildFeedbackSink feedbackSink)
{
// building a solution finishes immediately: we only care for the dependencies
feedbackSink.Done(true);
}
#endregion
}
}

12
src/Main/Base/Project/Src/Services/LanguageBinding/LanguageBindingService.cs

@ -129,8 +129,16 @@ namespace ICSharpCode.SharpDevelop @@ -129,8 +129,16 @@ namespace ICSharpCode.SharpDevelop
newProject.TypeGuid = projectTypeGuid;
}
} else {
newProject = new UnknownProject(location, title);
newProject.TypeGuid = projectTypeGuid;
string ext = Path.GetExtension(location);
if (".proj".Equals(ext, StringComparison.OrdinalIgnoreCase)
|| ".build".Equals(ext, StringComparison.OrdinalIgnoreCase))
{
newProject = new MSBuildFileProject(location, title);
newProject.TypeGuid = projectTypeGuid;
} else {
newProject = new UnknownProject(location, title);
newProject.TypeGuid = projectTypeGuid;
}
}
}
return newProject;

2
src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs

@ -132,7 +132,7 @@ namespace ICSharpCode.SharpDevelop @@ -132,7 +132,7 @@ namespace ICSharpCode.SharpDevelop
}
}
};
project.StartBuild(new BuildOptions(BuildTarget.ResolveComReferences, afterBuildCallback));
BuildEngine.BuildInGui(project, new BuildOptions(BuildTarget.ResolveComReferences, afterBuildCallback));
};
// enqueue actions when adding multiple COM references so that multiple builds of the same project

4
src/Main/Base/Project/Src/Util/ExtensionMethods.cs

@ -18,9 +18,9 @@ namespace ICSharpCode.SharpDevelop @@ -18,9 +18,9 @@ namespace ICSharpCode.SharpDevelop
public static class ExtensionMethods
{
/// <summary>
/// Applies an action to all elements in the input.
/// Runs an action for all elements in the input.
/// </summary>
public static void Apply<T>(this IEnumerable<T> input, Action<T> action)
public static void Foreach<T>(this IEnumerable<T> input, Action<T> action)
{
if (input == null)
throw new ArgumentNullException("input");

52
src/Main/ICSharpCode.SharpDevelop.BuildWorker/BuildJob.cs

@ -0,0 +1,52 @@ @@ -0,0 +1,52 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using System.Text;
namespace ICSharpCode.SharpDevelop.BuildWorker
{
/// <summary>
/// The settings used to start a build.
/// </summary>
[Serializable]
public class BuildJob
{
public string ProjectFileName { get; set; }
public string Target { get; set; }
Dictionary<string, string> properties = new Dictionary<string, string>();
public Dictionary<string, string> Properties {
get { return properties; }
}
List<string> additionalImports = new List<string>();
public List<string> AdditionalImports {
get { return additionalImports; }
}
public override string ToString()
{
StringBuilder b = new StringBuilder();
b.AppendLine("BuildJob:");
b.AppendLine(" ProjectFileName = " + ProjectFileName);
b.AppendLine(" Target = " + Target);
b.AppendLine(" " + Properties.Count + " Properties:");
foreach (KeyValuePair<string, string> pair in Properties) {
b.AppendLine(" " + pair.Key + " = " + pair.Value);
}
b.AppendLine(" " + AdditionalImports.Count + " Additional Imports:");
foreach (string import in AdditionalImports) {
b.AppendLine(" " + import);
}
return b.ToString();
}
}
}

16
src/Main/ICSharpCode.SharpDevelop.BuildWorker/Configuration/AssemblyInfo.cs

@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Reflection;
using System.Runtime.CompilerServices;
[assembly: AssemblyTitle("SharpDevelop Build Worker")]
[assembly: AssemblyDescription("Runs MSBuild")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

79
src/Main/ICSharpCode.SharpDevelop.BuildWorker/EventSource.cs

@ -0,0 +1,79 @@ @@ -0,0 +1,79 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
using Microsoft.Build.Framework;
namespace ICSharpCode.SharpDevelop.BuildWorker
{
class EventSource : IEventSource
{
public event BuildMessageEventHandler MessageRaised;
public event BuildErrorEventHandler ErrorRaised;
public event BuildWarningEventHandler WarningRaised;
public event BuildStartedEventHandler BuildStarted;
public event BuildFinishedEventHandler BuildFinished;
public event ProjectStartedEventHandler ProjectStarted;
public event ProjectFinishedEventHandler ProjectFinished;
public event TargetStartedEventHandler TargetStarted;
public event TargetFinishedEventHandler TargetFinished;
public event TaskStartedEventHandler TaskStarted;
public event TaskFinishedEventHandler TaskFinished;
public event CustomBuildEventHandler CustomEventRaised;
public event BuildStatusEventHandler StatusEventRaised;
public event AnyEventHandler AnyEventRaised;
public void RaiseEvent(BuildEventArgs e)
{
if (e is BuildStatusEventArgs) {
if (e is TargetStartedEventArgs) {
if (TargetStarted != null)
TargetStarted(this, (TargetStartedEventArgs)e);
} else if (e is TargetFinishedEventArgs) {
if (TargetFinished != null)
TargetFinished(this, (TargetFinishedEventArgs)e);
} else if (e is TaskStartedEventArgs) {
if (TaskStarted != null)
TaskStarted(this, (TaskStartedEventArgs)e);
} else if (e is TaskFinishedEventArgs) {
if (TaskFinished != null)
TaskFinished(this, (TaskFinishedEventArgs)e);
} else if (e is ProjectStartedEventArgs) {
if (ProjectStarted != null)
ProjectStarted(this, (ProjectStartedEventArgs)e);
} else if (e is ProjectFinishedEventArgs) {
if (ProjectFinished != null)
ProjectFinished(this, (ProjectFinishedEventArgs)e);
} else if (e is BuildStartedEventArgs) {
if (BuildStarted != null)
BuildStarted(this, (BuildStartedEventArgs)e);
} else if (e is BuildFinishedEventArgs) {
if (BuildFinished != null)
BuildFinished(this, (BuildFinishedEventArgs)e);
}
if (StatusEventRaised != null)
StatusEventRaised(this, (BuildStatusEventArgs)e);
} else if (e is BuildMessageEventArgs) {
if (MessageRaised != null)
MessageRaised(this, (BuildMessageEventArgs)e);
} else if (e is BuildWarningEventArgs) {
if (WarningRaised != null)
WarningRaised(this, (BuildWarningEventArgs)e);
} else if (e is BuildErrorEventArgs) {
if (ErrorRaised != null)
ErrorRaised(this, (BuildErrorEventArgs)e);
} else if (e is CustomBuildEventArgs) {
if (CustomEventRaised != null)
CustomEventRaised(this, (CustomBuildEventArgs)e);
}
if (AnyEventRaised != null)
AnyEventRaised(this, e);
}
}
}

70
src/Main/ICSharpCode.SharpDevelop.BuildWorker/ICSharpCode.SharpDevelop.BuildWorker.csproj

@ -0,0 +1,70 @@ @@ -0,0 +1,70 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<PropertyGroup>
<ProjectGuid>{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<OutputType>Exe</OutputType>
<RootNamespace>ICSharpCode.SharpDevelop.BuildWorker</RootNamespace>
<AssemblyName>ICSharpCode.SharpDevelop.BuildWorker</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<NoStdLib>False</NoStdLib>
<WarningLevel>4</WarningLevel>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<OutputPath>..\..\..\bin\</OutputPath>
<SignAssembly>True</SignAssembly>
<AssemblyOriginatorKeyFile>..\ICSharpCode.SharpDevelop.snk</AssemblyOriginatorKeyFile>
<DelaySign>False</DelaySign>
<AssemblyOriginatorKeyMode>File</AssemblyOriginatorKeyMode>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>Full</DebugType>
<Optimize>False</Optimize>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
<DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<DebugSymbols>False</DebugSymbols>
<DebugType>None</DebugType>
<Optimize>True</Optimize>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
<DefineConstants>TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
<RegisterForComInterop>False</RegisterForComInterop>
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
<BaseAddress>4194304</BaseAddress>
<PlatformTarget>AnyCPU</PlatformTarget>
<FileAlignment>4096</FileAlignment>
</PropertyGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
<ItemGroup>
<Reference Include="Microsoft.Build.Engine" />
<Reference Include="Microsoft.Build.Framework" />
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\GlobalAssemblyInfo.cs">
<Link>Configuration\GlobalAssemblyInfo.cs</Link>
</Compile>
<Compile Include="BuildJob.cs" />
<Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="EventSource.cs" />
<Compile Include="Interprocess\HostProcess.cs" />
<Compile Include="Interprocess\IHostObject.cs" />
<Compile Include="Interprocess\PacketReceiver.cs" />
<Compile Include="Interprocess\PacketSender.cs" />
<Compile Include="Interprocess\WorkerProcess.cs" />
<Compile Include="Program.cs" />
<Compile Include="WorkerManager.cs" />
<None Include="app.config" />
</ItemGroup>
<ItemGroup>
<Folder Include="Configuration" />
<Folder Include="Interprocess" />
</ItemGroup>
</Project>

102
src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/HostProcess.cs

@ -0,0 +1,102 @@ @@ -0,0 +1,102 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Reflection;
namespace ICSharpCode.SharpDevelop.BuildWorker.Interprocess
{
/// <summary>
/// Used in the worker process to refer to the host.
/// </summary>
public class HostProcess
{
object workerObject;
public HostProcess(object workerObject)
{
this.workerObject = workerObject;
}
TcpClient client;
PacketReceiver receiver;
PacketSender sender;
ManualResetEvent shutdownEvent;
bool connectionIsLost;
internal const int SendKeepAliveInterval = 10000;
public void WorkerProcessMain(string argument)
{
int port = int.Parse(argument);
client = new TcpClient();
client.Connect(new IPEndPoint(IPAddress.Loopback, port));
Stream stream = client.GetStream();
receiver = new PacketReceiver();
sender = new PacketSender(stream);
shutdownEvent = new ManualResetEvent(false);
receiver.ConnectionLost += OnConnectionLost;
receiver.PacketReceived += OnPacketReceived;
sender.WriteFailed += OnConnectionLost;
receiver.StartReceive(stream);
while (!shutdownEvent.WaitOne(SendKeepAliveInterval, false)) {
Program.Log("Sending keep-alive packet");
sender.Send(new byte[0]);
}
Program.Log("Closing client (end of WorkerProcessMain)");
client.Close();
shutdownEvent.Close();
}
public void Disconnect()
{
client.Close();
}
public void CallMethodOnHost(string methodName, params object[] args)
{
sender.Send(WorkerProcess.SerializeObject(new WorkerProcess.MethodCall(methodName, args)));
}
void OnConnectionLost(object sender, EventArgs e)
{
lock (this) {
if (connectionIsLost)
return;
Program.Log("OnConnectionLost");
connectionIsLost = true;
shutdownEvent.Set();
}
}
void OnPacketReceived(object sender, PacketReceivedEventArgs e)
{
Program.Log("OnPacketReceived");
if (e.Packet.Length != 0) {
try {
WorkerProcess.MethodCall mc = (WorkerProcess.MethodCall)WorkerProcess.DeserializeObject(e.Packet);
mc.CallOn(workerObject);
} catch (TargetInvocationException ex) {
Program.Log(ex.ToString());
CallMethodOnHost("ReportException", ex.InnerException);
} catch (Exception ex) {
Program.Log(ex.ToString());
CallMethodOnHost("ReportException", ex);
}
}
}
}
}

16
src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/IHostObject.cs

@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
namespace ICSharpCode.SharpDevelop.BuildWorker.Interprocess
{
public interface IHostObject
{
void ReportException(Exception ex);
}
}

138
src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/PacketReceiver.cs

@ -0,0 +1,138 @@ @@ -0,0 +1,138 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;
using System.IO;
using System.Runtime;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
namespace ICSharpCode.SharpDevelop.BuildWorker.Interprocess
{
public sealed class PacketReceiver
{
Stream stream;
byte[] buffer = new byte[10000];
int bufferReadOffset;
public void StartReceive(Stream stream)
{
if (stream == null)
throw new ArgumentNullException("stream");
if (this.stream != null)
throw new InvalidOperationException("StartReceive can be called only once.");
this.stream = stream;
try {
stream.BeginRead(buffer, 0, buffer.Length, OnReceive, null);
} catch (ObjectDisposedException) {
OnConnectionLost();
} catch (IOException) {
OnConnectionLost();
}
}
int maxPacketSize = int.MaxValue - 20000;
/// <summary>
/// Gets/Sets the maximum allowed packet size in bytes.
/// </summary>
public int MaxPacketSize {
get { return maxPacketSize; }
set {
if (value < 1)
throw new ArgumentOutOfRangeException("value", value, "MaxPacketSize must be >0");
maxPacketSize = value;
}
}
void OnReceive(IAsyncResult ar)
{
int bytes;
try {
bytes = stream.EndRead(ar);
} catch (ObjectDisposedException) {
OnConnectionLost();
return;
} catch (IOException) {
OnConnectionLost();
return;
}
bufferReadOffset += bytes;
int packetStart = 0;
int packetSize = -1;
while (bufferReadOffset >= packetStart + 4) {
packetSize = BitConverter.ToInt32(buffer, packetStart);
if (packetSize < 4)
throw new ProtocolViolationException("packetSize must be > 4");
if (packetSize - 4 > MaxPacketSize)
throw new ProtocolViolationException("packetSize must be smaller than MaxPacketSize");
if (bufferReadOffset >= packetStart + packetSize) {
//Debug.WriteLine("receiving packet of size " + packetSize);
byte[] packet = new byte[packetSize - 4];
Array.Copy(buffer, packetStart + 4, packet, 0, packet.Length);
OnPacketReceived(packet);
packetStart += packetSize;
} else {
break;
}
}
if (packetStart != 0) {
// copy half-received packet to the beginning of the buffer
int copyAmount = bufferReadOffset - packetStart;
for (int i = 0; i < copyAmount; i++) {
buffer[i] = buffer[i + packetStart];
}
bufferReadOffset = copyAmount;
}
if (packetSize > buffer.Length) {
Debug.WriteLine("resizing receive buffer for packet of size " + packetSize);
Array.Resize(ref buffer, Math.Max(packetSize, buffer.Length * 2));
}
try {
stream.BeginRead(buffer, bufferReadOffset, buffer.Length - bufferReadOffset, OnReceive, null);
} catch (ObjectDisposedException) {
OnConnectionLost();
} catch (IOException) {
OnConnectionLost();
}
}
void OnConnectionLost()
{
if (ConnectionLost != null)
ConnectionLost(this, EventArgs.Empty);
}
void OnPacketReceived(byte[] packet)
{
if (PacketReceived != null)
PacketReceived(this, new PacketReceivedEventArgs(packet));
}
public event EventHandler ConnectionLost;
public event EventHandler<PacketReceivedEventArgs> PacketReceived;
}
public class PacketReceivedEventArgs : EventArgs
{
byte[] packet;
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]
public byte[] Packet {
get { return packet; }
}
public PacketReceivedEventArgs(byte[] packet)
{
this.packet = packet;
}
}
}

67
src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/PacketSender.cs

@ -0,0 +1,67 @@ @@ -0,0 +1,67 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
using System.IO;
using System.Threading;
namespace ICSharpCode.SharpDevelop.BuildWorker.Interprocess
{
/// <summary>
/// Description of PacketSender.
/// </summary>
public sealed class PacketSender
{
Stream targetStream;
public PacketSender(Stream stream)
{
if (stream == null)
throw new ArgumentNullException("stream");
targetStream = stream;
}
public void Send(byte[] packet)
{
if (packet == null)
throw new ArgumentNullException("packet");
Send(new MemoryStream(packet, false));
}
public void Send(Stream stream)
{
if (stream == null)
throw new ArgumentNullException("stream");
byte[] buffer = new byte[4 + stream.Length];
unchecked {
buffer[0] = (byte)buffer.Length;
buffer[1] = (byte)(buffer.Length >> 8);
buffer[2] = (byte)(buffer.Length >> 16);
buffer[3] = (byte)(buffer.Length >> 24);
}
int pos = 4;
int c;
do {
c = stream.Read(buffer, pos, buffer.Length - pos);
pos += c;
} while (c > 0);
try {
targetStream.Write(buffer, 0, buffer.Length);
} catch (Exception ex) {
ICSharpCode.SharpDevelop.BuildWorker.Program.Log(ex.ToString());
OnWriteFailed();
}
}
void OnWriteFailed()
{
if (WriteFailed != null)
WriteFailed(this, EventArgs.Empty);
}
public event EventHandler WriteFailed;
}
}

224
src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/WorkerProcess.cs

@ -0,0 +1,224 @@ @@ -0,0 +1,224 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Diagnostics;
using System.Reflection;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.Threading;
namespace ICSharpCode.SharpDevelop.BuildWorker.Interprocess
{
/// <summary>
/// Manages a worker process that communicates with the host using a local TCP connection.
/// </summary>
public sealed class WorkerProcess
{
object hostObject;
public WorkerProcess(IHostObject hostObject)
{
if (hostObject == null)
throw new ArgumentException("hostObject");
this.hostObject = hostObject;
}
TcpListener listener;
Process process;
TcpClient client;
PacketSender sender;
PacketReceiver receiver;
public void Start(ProcessStartInfo info)
{
listener = new TcpListener(IPAddress.Loopback, 0);
listener.Start();
string argument = ((IPEndPoint)listener.LocalEndpoint).Port.ToString();
string oldArguments = info.Arguments;
info.Arguments += " " + argument;
process = Process.Start(info);
info.Arguments = oldArguments;
SetTimeout();
listener.BeginAcceptTcpClient(OnAcceptTcpClient, null);
}
Timer currentTimer;
void SetTimeout()
{
lock (this) {
ClearTimeout();
currentTimer = new Timer(OnTimeout, null, HostProcess.SendKeepAliveInterval * 3 / 2, -1);
}
}
void ClearTimeout()
{
lock (this) {
if (currentTimer != null) {
currentTimer.Dispose();
currentTimer = null;
}
}
}
void OnTimeout(object state)
{
Program.Log("OnTimeout");
Kill();
}
void OnAcceptTcpClient(IAsyncResult ar)
{
SetTimeout();
try {
client = listener.EndAcceptTcpClient(ar);
} catch (SocketException) {
// error connecting
}
listener.Stop();
listener = null;
if (client == null) {
OnConnectionLost(null, null);
} else {
Stream stream = client.GetStream();
receiver = new PacketReceiver();
sender = new PacketSender(stream);
receiver.ConnectionLost += OnConnectionLost;
receiver.PacketReceived += OnPacketReceived;
receiver.StartReceive(stream);
OnReady();
}
}
public void Shutdown()
{
Program.Log("Shutdown");
OnWorkerLost();
if (client != null) {
client.Close();
}
}
void OnConnectionLost(object sender, EventArgs e)
{
Program.Log("OnConnectionLost");
SetTimeout();
OnWorkerLost();
}
void OnPacketReceived(object sender, PacketReceivedEventArgs e)
{
SetTimeout();
if (e.Packet.Length != 0) {
MethodCall mc = (MethodCall)DeserializeObject(e.Packet);
mc.CallOn(hostObject);
}
}
public void Kill()
{
Program.Log("Kill");
ClearTimeout();
OnWorkerLost();
if (client != null) {
client.Close();
client = null;
}
if (process != null) {
try {
if (!process.HasExited) {
process.Kill();
}
} catch (InvalidOperationException) {
// may occur when the worker process crashes
}
process = null;
}
}
int workerIsLost;
void OnReady()
{
if (workerIsLost == 1)
return;
Program.Log("OnReady");
if (Ready != null)
Ready(this, EventArgs.Empty);
}
void OnWorkerLost()
{
if (Interlocked.Exchange(ref workerIsLost, 1) == 1)
return;
Program.Log("OnWorkerLost");
if (WorkerLost != null)
WorkerLost(this, EventArgs.Empty);
}
/// <summary>
/// Occurs when the worker process is ready to execute a job.
/// </summary>
public event EventHandler Ready;
/// <summary>
/// Occurs when the connection to the worker process broke.
/// </summary>
public event EventHandler WorkerLost;
public void CallMethodOnWorker(string methodName, params object[] args)
{
sender.Send(SerializeObject(new MethodCall(methodName, args)));
}
internal static MemoryStream SerializeObject(object obj)
{
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, obj);
ms.Position = 0;
return ms;
}
internal static object DeserializeObject(byte[] packet)
{
BinaryFormatter bf = new BinaryFormatter();
return bf.Deserialize(new MemoryStream(packet, false));
}
[Serializable]
internal class MethodCall
{
public readonly string MethodName;
public readonly object[] Arguments;
public MethodCall(string methodName, object[] arguments)
{
this.MethodName = methodName;
this.Arguments = arguments;
}
public void CallOn(object target)
{
target.GetType().InvokeMember(MethodName,
BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,
null, target, Arguments);
}
}
}
}

323
src/Main/ICSharpCode.SharpDevelop.BuildWorker/Program.cs

@ -0,0 +1,323 @@ @@ -0,0 +1,323 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using System.IO;
using System.Diagnostics;
using System.Threading;
using ICSharpCode.SharpDevelop.BuildWorker.Interprocess;
using Microsoft.Build.Framework;
using Microsoft.Build.BuildEngine;
// activate this define to see the build worker window
//#define WORKERDEBUG
namespace ICSharpCode.SharpDevelop.BuildWorker
{
class Program
{
static HostProcess host;
BuildJob currentJob;
bool requestCancellation;
internal static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomain_CurrentDomain_UnhandledException);
if (args.Length == 2 && args[0] == "worker") {
try {
host = new HostProcess(new Program());
host.WorkerProcessMain(args[1]);
} catch (Exception ex) {
ShowMessageBox(ex.ToString());
}
} else {
Program.Log("ICSharpCode.SharpDevelop.BuildWorker.exe is used to compile " +
"MSBuild projects inside SharpDevelop.");
Program.Log("If you want to compile projects on the command line, use " +
"MSBuild.exe (part of the .NET Framework)");
}
}
static void AppDomain_CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
ShowMessageBox(e.ExceptionObject.ToString());
}
internal static ProcessStartInfo CreateStartInfo()
{
ProcessStartInfo info = new ProcessStartInfo(typeof(Program).Assembly.Location);
info.WorkingDirectory = Path.GetDirectoryName(info.FileName);
info.Arguments = "worker";
#if RELEASE || !WORKERDEBUG
info.UseShellExecute = false;
info.CreateNoWindow = true;
#endif
return info;
}
internal static void ShowMessageBox(string text)
{
System.Windows.Forms.MessageBox.Show(text, "SharpDevelop Build Worker Process");
}
[Conditional("DEBUG")]
internal static void Log(string text)
{
#if WORKERDEBUG
DateTime now = DateTime.Now;
Console.WriteLine(now.ToString() + "," + now.Millisecond.ToString("d3") + " " + text);
#endif
}
// Called with CallMethodOnWorker
public void StartBuild(BuildJob job)
{
if (job == null)
throw new ArgumentNullException("job");
lock (this) {
if (currentJob != null)
throw new InvalidOperationException("Already running a job");
currentJob = job;
requestCancellation = false;
}
#if DEBUG && WORKERDEBUG
Console.Title = "BuildWorker - " + Path.GetFileName(job.ProjectFileName);
#endif
Program.Log("Got job:");
Program.Log(job.ToString());
Program.Log("Start build thread");
Thread thread = new Thread(RunThread);
thread.Name = "Build thread";
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
// Called with CallMethodOnWorker
public void CancelBuild()
{
lock (this) {
requestCancellation = true;
}
}
Engine engine;
void RunThread()
{
Program.Log("In build thread");
bool success = false;
try {
if (engine == null) {
engine = CreateEngine();
}
success = DoBuild();
} catch (Exception ex) {
host.CallMethodOnHost("ReportException", ex);
} finally {
Program.Log("BuildDone");
#if DEBUG && WORKERDEBUG
Console.Title = "BuildWorker - no job";
#endif
lock (this) {
currentJob = null;
}
// in the moment we call BuildDone, we can get the next job
host.CallMethodOnHost("BuildDone", success);
}
}
Engine CreateEngine()
{
Engine engine = new Engine(ToolsetDefinitionLocations.Registry
| ToolsetDefinitionLocations.ConfigurationFile);
engine.RegisterLogger(new ForwardingLogger(this));
return engine;
}
InProcessLogger inProcessLogger;
internal void BuildInProcess(BuildSettings settings, BuildJob job)
{
lock (this) {
if (currentJob != null)
throw new InvalidOperationException("Already running a job");
currentJob = job;
requestCancellation = false;
inProcessLogger = new InProcessLogger();
}
bool success = false;
try {
if (engine == null) {
engine = new Engine(ToolsetDefinitionLocations.Registry
| ToolsetDefinitionLocations.ConfigurationFile);
}
engine.UnregisterAllLoggers();
engine.RegisterLogger(inProcessLogger);
foreach (ILogger logger in settings.Logger) {
logger.Initialize(inProcessLogger.EventSource);
}
success = DoBuild();
foreach (ILogger logger in settings.Logger) {
logger.Shutdown();
}
engine.UnregisterAllLoggers();
} catch (Exception ex) {
if (WorkerManager.ShowError != null)
WorkerManager.ShowError(ex);
else
Program.ShowMessageBox(ex.ToString());
} finally {
lock (this) {
currentJob = null;
}
if (settings.BuildDoneCallback != null)
settings.BuildDoneCallback(success);
}
}
bool DoBuild()
{
engine.GlobalProperties.Clear();
foreach (KeyValuePair<string, string> pair in currentJob.Properties) {
engine.GlobalProperties.SetProperty(pair.Key, pair.Value);
}
Project project = LoadProject(engine, currentJob.ProjectFileName);
if (project == null)
return false;
if (string.IsNullOrEmpty(currentJob.Target)) {
return engine.BuildProject(project);
} else {
return engine.BuildProject(project, currentJob.Target.Split(';'));
}
}
Project LoadProject(Engine engine, string fileName)
{
Project project = engine.CreateNewProject();
try {
project.Load(fileName);
// When we set BuildingInsideVisualStudio, MSBuild tries to build all projects
// every time because in Visual Studio, the host compiler does the change detection
// We override the property '_ComputeNonExistentFileProperty' which is responsible
// for recompiling each time - our _ComputeNonExistentFileProperty does nothing,
// which re-enables the MSBuild's usual change detection
project.Targets.AddNewTarget("_ComputeNonExistentFileProperty");
foreach (string additionalImport in currentJob.AdditionalImports) {
project.AddNewImport(additionalImport, null);
}
return project;
} catch (ArgumentException ex) {
ReportError(ex.Message);
} catch (InvalidProjectFileException ex) {
ReportError(new BuildErrorEventArgs(ex.ErrorSubcategory, ex.ErrorCode, ex.ProjectFile,
ex.LineNumber, ex.ColumnNumber, ex.EndLineNumber, ex.EndColumnNumber,
ex.BaseMessage, ex.HelpKeyword, ex.Source));
}
return null;
}
void ReportError(string message)
{
ReportError(new BuildErrorEventArgs(null, null, null, -1, -1, -1, -1,
message, null, "SharpDevelopBuildWorker"));
}
void ReportError(BuildErrorEventArgs e)
{
if (host != null) {
HostReportEvent(e);
} else {
// enable error reporting for in-process builds
InProcessLogger logger = inProcessLogger;
if (logger != null) {
logger.EventSource.RaiseEvent(e);
}
}
}
void HostReportEvent(BuildEventArgs e)
{
host.CallMethodOnHost("ReportEvent", e);
}
sealed class ForwardingLogger : ILogger
{
Program program;
public ForwardingLogger(Program program)
{
this.program = program;
}
IEventSource eventSource;
public LoggerVerbosity Verbosity { get; set; }
public string Parameters { get; set; }
public void Initialize(IEventSource eventSource)
{
this.eventSource = eventSource;
eventSource.AnyEventRaised += OnAnyEventRaised;
}
public void Shutdown()
{
eventSource.AnyEventRaised -= OnAnyEventRaised;
}
void OnAnyEventRaised(object sender, BuildEventArgs e)
{
if (program.requestCancellation)
throw new BuildCancelException();
program.HostReportEvent(e);
}
}
sealed class InProcessLogger : ILogger
{
public readonly EventSource EventSource = new EventSource();
public LoggerVerbosity Verbosity { get; set; }
public string Parameters { get; set; }
IEventSource realEventSource;
public void Initialize(IEventSource eventSource)
{
this.realEventSource = eventSource;
this.realEventSource.AnyEventRaised += OnAnyEventRaised;
}
public void Shutdown()
{
this.realEventSource.AnyEventRaised -= OnAnyEventRaised;
}
void OnAnyEventRaised(object sender, BuildEventArgs e)
{
this.EventSource.RaiseEvent(e);
}
}
[Serializable]
sealed class BuildCancelException : Exception
{
}
}
}

265
src/Main/ICSharpCode.SharpDevelop.BuildWorker/WorkerManager.cs

@ -0,0 +1,265 @@ @@ -0,0 +1,265 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using Microsoft.Build.Framework;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Diagnostics;
using ICSharpCode.SharpDevelop.BuildWorker.Interprocess;
namespace ICSharpCode.SharpDevelop.BuildWorker
{
/// <summary>
/// Manages the list of running child worker processes.
/// </summary>
public static class WorkerManager
{
/// <summary>
/// Delegate executed on the host when an exception occurs.
/// </summary>
public static Action<Exception> ShowError { get; set; }
const int MaxWorkerProcessCount = 16;
static readonly object lockObject = new object();
static Queue<BuildRun> outstandingBuildRuns = new Queue<BuildRun>();
static int workerProcessCount;
static List<WorkerProcessHost> freeWorkerProcesses = new List<WorkerProcessHost>();
static WorkerProcessHost DequeueFreeWorkerProcess()
{
WorkerProcessHost h = freeWorkerProcesses[freeWorkerProcesses.Count - 1];
freeWorkerProcesses.RemoveAt(freeWorkerProcesses.Count - 1);
return h;
}
public static void StartBuild(BuildJob job, BuildSettings settings)
{
if (job == null)
throw new ArgumentNullException("job");
if (settings == null)
throw new ArgumentNullException("settings");
BuildRun buildRun = new BuildRun(job, settings);
lock (lockObject) {
if (freeWorkerProcesses.Count > 0) {
DequeueFreeWorkerProcess().StartBuild(buildRun);
} else {
outstandingBuildRuns.Enqueue(buildRun);
if (workerProcessCount < MaxWorkerProcessCount) {
workerProcessCount++;
(new WorkerProcessHost()).Start();
}
}
}
}
static Program inProcessBuildWorker;
public static void RunBuildInProcess(BuildJob job, BuildSettings settings)
{
if (job == null)
throw new ArgumentNullException("job");
if (settings == null)
throw new ArgumentNullException("settings");
lock (lockObject) {
if (inProcessBuildWorker == null)
inProcessBuildWorker = new Program();
}
inProcessBuildWorker.BuildInProcess(settings, job);
}
static readonly object timerLock = new object();
static Timer lastBuildDoneTimer;
static void SetLastBuildDoneTimer()
{
lock (timerLock) {
if (lastBuildDoneTimer != null) {
lastBuildDoneTimer.Dispose();
lastBuildDoneTimer = null;
}
lastBuildDoneTimer = new Timer(LastBuildDoneTimerCallback, null, 60000, 20000);
}
}
static void ClearLastBuildDoneTimer()
{
lock (timerLock) {
if (lastBuildDoneTimer != null) {
lastBuildDoneTimer.Dispose();
lastBuildDoneTimer = null;
}
}
}
static void LastBuildDoneTimerCallback(object state)
{
lock (lockObject) {
if (freeWorkerProcesses.Count > 0) {
DequeueFreeWorkerProcess().Shutdown();
} else {
ClearLastBuildDoneTimer();
}
}
}
sealed class BuildRun
{
internal BuildJob job;
internal BuildSettings settings;
EventSource eventSource = new EventSource();
public BuildRun(BuildJob job, BuildSettings settings)
{
this.job = job;
this.settings = settings;
foreach (ILogger logger in settings.Logger) {
logger.Initialize(eventSource);
}
}
public void RaiseError(string message)
{
RaiseEvent(new BuildErrorEventArgs(null, null, null, -1, -1, -1, -1, message, null, "SharpDevelopBuildWorkerManager"));
}
public void RaiseEvent(BuildEventArgs e)
{
eventSource.RaiseEvent(e);
}
public void Done(bool success)
{
SetLastBuildDoneTimer();
try {
foreach (ILogger logger in settings.Logger) {
logger.Shutdown();
}
} finally {
if (settings.BuildDoneCallback != null)
settings.BuildDoneCallback(success);
}
}
}
sealed class WorkerProcessHost : IHostObject
{
WorkerProcess process;
internal void Start()
{
process = new WorkerProcess(this);
process.Ready += OnReady;
process.WorkerLost += OnWorkerLost;
process.Start(Program.CreateStartInfo());
}
BuildRun currentBuildRun;
// runs in lock(lockObject)
internal void StartBuild(BuildRun nextBuildRun)
{
Debug.Assert(currentBuildRun == null);
currentBuildRun = nextBuildRun;
process.CallMethodOnWorker("StartBuild", currentBuildRun.job);
}
void OnReady(object sender, EventArgs e)
{
BuildRun nextBuildRun = null;
lock (lockObject) {
if (outstandingBuildRuns.Count > 0)
nextBuildRun = outstandingBuildRuns.Dequeue();
else
freeWorkerProcesses.Add(this);
}
if (nextBuildRun != null) {
StartBuild(nextBuildRun);
}
}
void OnWorkerLost(object sender, EventArgs e)
{
lock (lockObject) {
workerProcessCount--;
freeWorkerProcesses.Remove(this);
if (workerProcessCount == 0 && currentBuildRun == null) {
// error starting worker => we must
// cancel all outstanding build runs to prevent them from waiting
// for a worker becoming ready when all workers are dead
while (workerProcessCount == 0 && outstandingBuildRuns.Count > 0) {
BuildRun r = outstandingBuildRuns.Dequeue();
Monitor.Exit(lockObject);
r.RaiseError("Error starting worker process.");
r.Done(false);
Monitor.Enter(lockObject);
}
}
}
BuildRun buildRun = Interlocked.Exchange(ref currentBuildRun, null);
if (buildRun != null) {
buildRun.RaiseError("Worker process lost during build");
buildRun.Done(false);
}
}
internal void Shutdown()
{
process.Shutdown();
}
// Called with CallMethodOnHost
public void ReportEvent(BuildEventArgs e)
{
BuildRun buildRun = currentBuildRun;
if (buildRun != null) {
buildRun.RaiseEvent(e);
}
}
// Called with CallMethodOnHost
public void BuildDone(bool success)
{
BuildRun buildRun = Interlocked.Exchange(ref currentBuildRun, null);
if (buildRun != null) {
// OnReady must be called before buildRun.Done - the callback
// might trigger another build, and if this worker process
// isn't marked as ready, a new process will be created even
// though this one could do the work.
OnReady(null, null);
buildRun.Done(success);
}
}
public void ReportException(Exception ex)
{
// shutdown worker if it produced an exception
try {
process.Shutdown();
} catch {}
if (ShowError != null)
ShowError(ex);
else
Program.ShowMessageBox(ex.ToString());
}
}
}
public sealed class BuildSettings
{
List<ILogger> logger = new List<ILogger>();
public Action<bool> BuildDoneCallback { get; set; }
public ICollection<ILogger> Logger {
get { return logger; }
}
}
}

15
src/Main/ICSharpCode.SharpDevelop.BuildWorker/app.config

@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<!-- redirect MSBuild.Framework requests to make old task assemblies work with MSBuild 3.5 -->
<dependentAssembly>
<assemblyIdentity name="Microsoft.Build.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="3.5.0.0"/>
</dependentAssembly>
<!--<dependentAssembly>
<assemblyIdentity name="Microsoft.CompactFramework.Build.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="9.0.0.0"/>
</dependentAssembly>-->
</assemblyBinding>
</runtime>
</configuration>

175
src/SharpDevelop.Tests.sln

@ -1,110 +1,112 @@ @@ -1,110 +1,112 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
# SharpDevelop 3.0.0.2644
# SharpDevelop 3.0.0.2693
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AddIns", "AddIns", "{14A277EE-7DF1-4529-B639-7D1EF334C1C5}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SearchAndReplace.Tests", "AddIns\Misc\SearchAndReplace\Test\SearchAndReplace.Tests.csproj", "{A569DCC1-C608-45FD-B770-4F79335EF154}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpBinding", "AddIns\BackendBindings\CSharpBinding\Project\CSharpBinding.csproj", "{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SearchAndReplace", "AddIns\Misc\SearchAndReplace\Project\SearchAndReplace.csproj", "{9196DD8A-B4D4-4780-8742-C5762E547FC2}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryToBooConverter", "AddIns\BackendBindings\Boo\NRefactoryToBooConverter\Project\NRefactoryToBooConverter.csproj", "{DBCF20A1-BA13-4582-BFA9-74DE4D987B73}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WpfDesign", "WpfDesign", "{C12B6EA7-2EFC-4368-B585-EC69EFCC3F97}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryToBooConverter.Tests", "AddIns\BackendBindings\Boo\NRefactoryToBooConverter\Test\NRefactoryToBooConverter.Tests.csproj", "{C9DE556D-325C-4544-B29F-16A9EB7C9830}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debugger", "Debugger", "{6604365C-C702-4C10-9BA8-637F1E3D4D0D}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign", "AddIns\DisplayBindings\WpfDesign\WpfDesign\Project\WpfDesign.csproj", "{66A378A1-E9F4-4AD5-8946-D0EC06C2902F}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TreeListView", "AddIns\Misc\Debugger\TreeListView\Project\TreeListView.csproj", "{B08385CD-F0CC-488C-B4F4-EEB34B6D2688}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.Designer", "AddIns\DisplayBindings\WpfDesign\WpfDesign.Designer\Project\WpfDesign.Designer.csproj", "{78CC29AC-CC79-4355-B1F2-97936DF198AC}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.Core", "AddIns\Misc\Debugger\Debugger.Core\Project\Debugger.Core.csproj", "{1D18D788-F7EE-4585-A23B-34DC8EC63CB8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.Tests", "AddIns\DisplayBindings\WpfDesign\WpfDesign.Designer\Tests\WpfDesign.Tests.csproj", "{943DBBB3-E84E-4CF4-917C-C05AFA8743C1}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.AddIn", "AddIns\Misc\Debugger\Debugger.AddIn\Project\Debugger.AddIn.csproj", "{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.XamlDom", "AddIns\DisplayBindings\WpfDesign\WpfDesign.XamlDom\Project\WpfDesign.XamlDom.csproj", "{88DA149F-21B2-48AB-82C4-28FB6BDFD783}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.Tests", "AddIns\Misc\Debugger\Debugger.Tests\Project\Debugger.Tests.csproj", "{A4C858C8-51B6-4265-A695-A20FCEBA1D19}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting.Tests", "AddIns\Misc\UnitTesting\Test\UnitTesting.Tests.csproj", "{44A8DE09-CAB9-49D8-9CFC-5EB0A552F181}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XmlEditor", "AddIns\DisplayBindings\XmlEditor\Project\XmlEditor.csproj", "{6B717BD1-CD5E-498C-A42E-9E6A4584DC48}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixBinding.Tests", "AddIns\BackendBindings\WixBinding\Test\WixBinding.Tests.csproj", "{388E7B64-0393-4EB4-A3E3-5C474F141853}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XmlEditor.Tests", "AddIns\DisplayBindings\XmlEditor\Test\XmlEditor.Tests.csproj", "{FC0FE702-A87D-4D70-A9B6-1ECCD611125F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixBinding", "AddIns\BackendBindings\WixBinding\Project\WixBinding.csproj", "{e1b288a2-08ee-4318-8bbb-8ab72c69e33e}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VBNetBinding", "AddIns\BackendBindings\VBNetBinding\Project\VBNetBinding.csproj", "{BF38FB72-B380-4196-AF8C-95749D726C61}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeAnalysis", "AddIns\Misc\CodeAnalysis\CodeAnalysis.csproj", "{3EAA45A9-735C-4AC7-A799-947B93EA449D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage.Tests", "AddIns\Misc\CodeCoverage\Test\CodeCoverage.Tests.csproj", "{A5C0E8F8-9D04-46ED-91D6-1DEF1575313B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsDesigner", "AddIns\DisplayBindings\FormsDesigner\Project\FormsDesigner.csproj", "{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage", "AddIns\Misc\CodeCoverage\Project\CodeCoverage.csproj", "{08ce9972-283b-44f4-82fa-966f7dfa6b7a}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding.Tests", "AddIns\BackendBindings\Boo\BooBinding\Test\BooBinding.Tests.csproj", "{6FA16499-896F-4C02-BB43-1AF5C6C7C713}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting", "AddIns\Misc\UnitTesting\UnitTesting.csproj", "{1F261725-6318-4434-A1B1-6C70CE4CD324}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding", "AddIns\BackendBindings\Boo\BooBinding\Project\BooBinding.csproj", "{4AC2D5F1-F671-480C-A075-6BF62B3721B2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting", "AddIns\Misc\UnitTesting\UnitTesting.csproj", "{1F261725-6318-4434-A1B1-6C70CE4CD324}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding.Tests", "AddIns\BackendBindings\Boo\BooBinding\Test\BooBinding.Tests.csproj", "{6FA16499-896F-4C02-BB43-1AF5C6C7C713}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage", "AddIns\Misc\CodeCoverage\Project\CodeCoverage.csproj", "{08ce9972-283b-44f4-82fa-966f7dfa6b7a}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsDesigner", "AddIns\DisplayBindings\FormsDesigner\Project\FormsDesigner.csproj", "{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage.Tests", "AddIns\Misc\CodeCoverage\Test\CodeCoverage.Tests.csproj", "{A5C0E8F8-9D04-46ED-91D6-1DEF1575313B}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeAnalysis", "AddIns\Misc\CodeAnalysis\CodeAnalysis.csproj", "{3EAA45A9-735C-4AC7-A799-947B93EA449D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VBNetBinding", "AddIns\BackendBindings\VBNetBinding\Project\VBNetBinding.csproj", "{BF38FB72-B380-4196-AF8C-95749D726C61}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixBinding", "AddIns\BackendBindings\WixBinding\Project\WixBinding.csproj", "{e1b288a2-08ee-4318-8bbb-8ab72c69e33e}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XmlEditor.Tests", "AddIns\DisplayBindings\XmlEditor\Test\XmlEditor.Tests.csproj", "{FC0FE702-A87D-4D70-A9B6-1ECCD611125F}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixBinding.Tests", "AddIns\BackendBindings\WixBinding\Test\WixBinding.Tests.csproj", "{388E7B64-0393-4EB4-A3E3-5C474F141853}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XmlEditor", "AddIns\DisplayBindings\XmlEditor\Project\XmlEditor.csproj", "{6B717BD1-CD5E-498C-A42E-9E6A4584DC48}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting.Tests", "AddIns\Misc\UnitTesting\Test\UnitTesting.Tests.csproj", "{44A8DE09-CAB9-49D8-9CFC-5EB0A552F181}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debugger", "Debugger", "{6604365C-C702-4C10-9BA8-637F1E3D4D0D}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WpfDesign", "WpfDesign", "{C12B6EA7-2EFC-4368-B585-EC69EFCC3F97}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.Tests", "AddIns\Misc\Debugger\Debugger.Tests\Project\Debugger.Tests.csproj", "{A4C858C8-51B6-4265-A695-A20FCEBA1D19}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.AddIn", "AddIns\Misc\Debugger\Debugger.AddIn\Project\Debugger.AddIn.csproj", "{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.XamlDom", "AddIns\DisplayBindings\WpfDesign\WpfDesign.XamlDom\Project\WpfDesign.XamlDom.csproj", "{88DA149F-21B2-48AB-82C4-28FB6BDFD783}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.Core", "AddIns\Misc\Debugger\Debugger.Core\Project\Debugger.Core.csproj", "{1D18D788-F7EE-4585-A23B-34DC8EC63CB8}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.Tests", "AddIns\DisplayBindings\WpfDesign\WpfDesign.Designer\Tests\WpfDesign.Tests.csproj", "{943DBBB3-E84E-4CF4-917C-C05AFA8743C1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TreeListView", "AddIns\Misc\Debugger\TreeListView\Project\TreeListView.csproj", "{B08385CD-F0CC-488C-B4F4-EEB34B6D2688}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.Designer", "AddIns\DisplayBindings\WpfDesign\WpfDesign.Designer\Project\WpfDesign.Designer.csproj", "{78CC29AC-CC79-4355-B1F2-97936DF198AC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryToBooConverter.Tests", "AddIns\BackendBindings\Boo\NRefactoryToBooConverter\Test\NRefactoryToBooConverter.Tests.csproj", "{C9DE556D-325C-4544-B29F-16A9EB7C9830}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign", "AddIns\DisplayBindings\WpfDesign\WpfDesign\Project\WpfDesign.csproj", "{66A378A1-E9F4-4AD5-8946-D0EC06C2902F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryToBooConverter", "AddIns\BackendBindings\Boo\NRefactoryToBooConverter\Project\NRefactoryToBooConverter.csproj", "{DBCF20A1-BA13-4582-BFA9-74DE4D987B73}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SearchAndReplace", "AddIns\Misc\SearchAndReplace\Project\SearchAndReplace.csproj", "{9196DD8A-B4D4-4780-8742-C5762E547FC2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpBinding", "AddIns\BackendBindings\CSharpBinding\Project\CSharpBinding.csproj", "{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SearchAndReplace.Tests", "AddIns\Misc\SearchAndReplace\Test\SearchAndReplace.Tests.csproj", "{A569DCC1-C608-45FD-B770-4F79335EF154}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{9421EDF4-9769-4BE9-B5A6-C87DE221D73C}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Aga.Controls", "Libraries\TreeViewAdv\Aga.Controls\Aga.Controls.csproj", "{E73BB233-D88B-44A7-A98F-D71EE158381D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Build.Tasks.Tests", "Libraries\ICSharpCode.Build.Tasks\Test\ICSharpCode.Build.Tasks.Tests.csproj", "{B7C2A664-B454-4920-AC6E-318F5274B2EF}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactory", "Libraries\NRefactory\Project\NRefactory.csproj", "{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor.Tests", "Libraries\ICSharpCode.TextEditor\Test\ICSharpCode.TextEditor.Tests.csproj", "{6259D767-BA7C-484D-9472-68F350A20086}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinFormsUI", "Libraries\DockPanel_Src\WinFormsUI\WinFormsUI.csproj", "{D3C782BA-178E-4235-A3BA-8C11DEBB6BEE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor", "Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Build.Tasks", "Libraries\ICSharpCode.Build.Tasks\Project\ICSharpCode.Build.Tasks.csproj", "{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryTests", "Libraries\NRefactory\Test\NRefactoryTests.csproj", "{870115DD-960A-4406-A6B9-600BCDC36A03}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Build.Tasks", "Libraries\ICSharpCode.Build.Tasks\Project\ICSharpCode.Build.Tasks.csproj", "{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor", "Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinFormsUI", "Libraries\DockPanel_Src\WinFormsUI\WinFormsUI.csproj", "{D3C782BA-178E-4235-A3BA-8C11DEBB6BEE}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor.Tests", "Libraries\ICSharpCode.TextEditor\Test\ICSharpCode.TextEditor.Tests.csproj", "{6259D767-BA7C-484D-9472-68F350A20086}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactory", "Libraries\NRefactory\Project\NRefactory.csproj", "{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Build.Tasks.Tests", "Libraries\ICSharpCode.Build.Tasks\Test\ICSharpCode.Build.Tasks.Tests.csproj", "{B7C2A664-B454-4920-AC6E-318F5274B2EF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Aga.Controls", "Libraries\TreeViewAdv\Aga.Controls\Aga.Controls.csproj", "{E73BB233-D88B-44A7-A98F-D71EE158381D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Main", "Main", "{5A3EBEBA-0560-41C1-966B-23F7D03A5486}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Widgets", "Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj", "{8035765F-D51F-4A0C-A746-2FD100E19419}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartUp", "Main\StartUp\Project\StartUp.csproj", "{1152B71B-3C05-4598-B20D-823B5D40559E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Dom", "Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj", "{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "Main\Core\Project\ICSharpCode.Core.csproj", "{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Sda", "Main\ICSharpCode.SharpDevelop.Sda\ICSharpCode.SharpDevelop.Sda.csproj", "{80318B5F-A25D-45AB-8A95-EF31D2370A4C}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop", "Main\Base\Project\ICSharpCode.SharpDevelop.csproj", "{2748AD25-9C63-4E12-877B-4DCE96FBED54}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Tests", "Main\Base\Test\ICSharpCode.SharpDevelop.Tests.csproj", "{4980B743-B32F-4aba-AABD-45E2CAD3568D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.Tests", "Main\Core\Test\ICSharpCode.Core.Tests.csproj", "{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Tests", "Main\Base\Test\ICSharpCode.SharpDevelop.Tests.csproj", "{4980B743-B32F-4aba-AABD-45E2CAD3568D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Sda", "Main\ICSharpCode.SharpDevelop.Sda\ICSharpCode.SharpDevelop.Sda.csproj", "{80318B5F-A25D-45AB-8A95-EF31D2370A4C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop", "Main\Base\Project\ICSharpCode.SharpDevelop.csproj", "{2748AD25-9C63-4E12-877B-4DCE96FBED54}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Dom", "Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj", "{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "Main\Core\Project\ICSharpCode.Core.csproj", "{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Widgets", "Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj", "{8035765F-D51F-4A0C-A746-2FD100E19419}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartUp", "Main\StartUp\Project\StartUp.csproj", "{1152B71B-3C05-4598-B20D-823B5D40559E}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.BuildWorker", "Main\ICSharpCode.SharpDevelop.BuildWorker\ICSharpCode.SharpDevelop.BuildWorker.csproj", "{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}"
EndProject
Project("{00000000-0000-0000-0000-000000000000}") = "Tools", "Tools\Tools.build", "{970116b0-f96b-4257-8579-986b9cf086f5}"
EndProject
@ -322,54 +324,59 @@ Global @@ -322,54 +324,59 @@ Global
{A569DCC1-C608-45FD-B770-4F79335EF154}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A569DCC1-C608-45FD-B770-4F79335EF154}.Release|Any CPU.Build.0 = Release|Any CPU
{A569DCC1-C608-45FD-B770-4F79335EF154}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Release|Any CPU.Build.0 = Release|Any CPU
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Release|Any CPU.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{DBCF20A1-BA13-4582-BFA9-74DE4D987B73} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{C9DE556D-325C-4544-B29F-16A9EB7C9830} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{6604365C-C702-4C10-9BA8-637F1E3D4D0D} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{6B717BD1-CD5E-498C-A42E-9E6A4584DC48} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{FC0FE702-A87D-4D70-A9B6-1ECCD611125F} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{BF38FB72-B380-4196-AF8C-95749D726C61} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{A5C0E8F8-9D04-46ED-91D6-1DEF1575313B} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{08ce9972-283b-44f4-82fa-966f7dfa6b7a} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{1F261725-6318-4434-A1B1-6C70CE4CD324} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{4AC2D5F1-F671-480C-A075-6BF62B3721B2} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{6FA16499-896F-4C02-BB43-1AF5C6C7C713} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{3EAA45A9-735C-4AC7-A799-947B93EA449D} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{e1b288a2-08ee-4318-8bbb-8ab72c69e33e} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{388E7B64-0393-4EB4-A3E3-5C474F141853} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{44A8DE09-CAB9-49D8-9CFC-5EB0A552F181} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{C12B6EA7-2EFC-4368-B585-EC69EFCC3F97} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{9196DD8A-B4D4-4780-8742-C5762E547FC2} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{A569DCC1-C608-45FD-B770-4F79335EF154} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{88DA149F-21B2-48AB-82C4-28FB6BDFD783} = {C12B6EA7-2EFC-4368-B585-EC69EFCC3F97}
{943DBBB3-E84E-4CF4-917C-C05AFA8743C1} = {C12B6EA7-2EFC-4368-B585-EC69EFCC3F97}
{78CC29AC-CC79-4355-B1F2-97936DF198AC} = {C12B6EA7-2EFC-4368-B585-EC69EFCC3F97}
{66A378A1-E9F4-4AD5-8946-D0EC06C2902F} = {C12B6EA7-2EFC-4368-B585-EC69EFCC3F97}
{B08385CD-F0CC-488C-B4F4-EEB34B6D2688} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{1D18D788-F7EE-4585-A23B-34DC8EC63CB8} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{9196DD8A-B4D4-4780-8742-C5762E547FC2} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{C12B6EA7-2EFC-4368-B585-EC69EFCC3F97} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{44A8DE09-CAB9-49D8-9CFC-5EB0A552F181} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{388E7B64-0393-4EB4-A3E3-5C474F141853} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{e1b288a2-08ee-4318-8bbb-8ab72c69e33e} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{3EAA45A9-735C-4AC7-A799-947B93EA449D} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{6FA16499-896F-4C02-BB43-1AF5C6C7C713} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{4AC2D5F1-F671-480C-A075-6BF62B3721B2} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{1F261725-6318-4434-A1B1-6C70CE4CD324} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{08ce9972-283b-44f4-82fa-966f7dfa6b7a} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{A5C0E8F8-9D04-46ED-91D6-1DEF1575313B} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{BF38FB72-B380-4196-AF8C-95749D726C61} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{FC0FE702-A87D-4D70-A9B6-1ECCD611125F} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{6B717BD1-CD5E-498C-A42E-9E6A4584DC48} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{6604365C-C702-4C10-9BA8-637F1E3D4D0D} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{C9DE556D-325C-4544-B29F-16A9EB7C9830} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{DBCF20A1-BA13-4582-BFA9-74DE4D987B73} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{A4C858C8-51B6-4265-A695-A20FCEBA1D19} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{D3C782BA-178E-4235-A3BA-8C11DEBB6BEE} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{870115DD-960A-4406-A6B9-600BCDC36A03} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{6259D767-BA7C-484D-9472-68F350A20086} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{B7C2A664-B454-4920-AC6E-318F5274B2EF} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{1D18D788-F7EE-4585-A23B-34DC8EC63CB8} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{B08385CD-F0CC-488C-B4F4-EEB34B6D2688} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{66A378A1-E9F4-4AD5-8946-D0EC06C2902F} = {C12B6EA7-2EFC-4368-B585-EC69EFCC3F97}
{78CC29AC-CC79-4355-B1F2-97936DF198AC} = {C12B6EA7-2EFC-4368-B585-EC69EFCC3F97}
{943DBBB3-E84E-4CF4-917C-C05AFA8743C1} = {C12B6EA7-2EFC-4368-B585-EC69EFCC3F97}
{88DA149F-21B2-48AB-82C4-28FB6BDFD783} = {C12B6EA7-2EFC-4368-B585-EC69EFCC3F97}
{E73BB233-D88B-44A7-A98F-D71EE158381D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{1152B71B-3C05-4598-B20D-823B5D40559E} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{2748AD25-9C63-4E12-877B-4DCE96FBED54} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{4980B743-B32F-4aba-AABD-45E2CAD3568D} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{80318B5F-A25D-45AB-8A95-EF31D2370A4C} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{924EE450-603D-49C1-A8E5-4AFAA31CE6F3} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{B7C2A664-B454-4920-AC6E-318F5274B2EF} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{6259D767-BA7C-484D-9472-68F350A20086} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{870115DD-960A-4406-A6B9-600BCDC36A03} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{D3C782BA-178E-4235-A3BA-8C11DEBB6BEE} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{8035765F-D51F-4A0C-A746-2FD100E19419} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{924EE450-603D-49C1-A8E5-4AFAA31CE6F3} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{80318B5F-A25D-45AB-8A95-EF31D2370A4C} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{4980B743-B32F-4aba-AABD-45E2CAD3568D} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{2748AD25-9C63-4E12-877B-4DCE96FBED54} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{1152B71B-3C05-4598-B20D-823B5D40559E} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
EndGlobalSection
EndGlobal

293
src/SharpDevelop.sln

@ -1,176 +1,178 @@ @@ -1,176 +1,178 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
# SharpDevelop 3.0.0.2667
# SharpDevelop 3.0.0.2693
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AddIns", "AddIns", "{14A277EE-7DF1-4529-B639-7D1EF334C1C5}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Misc", "Misc", "{CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Display Bindings", "Display Bindings", "{4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SearchAndReplace", "AddIns\Misc\SearchAndReplace\Project\SearchAndReplace.csproj", "{9196DD8A-B4D4-4780-8742-C5762E547FC2}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WpfDesign", "WpfDesign", "{388C3979-2621-4839-A955-7E5C03BA0B63}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddinScout", "AddIns\Misc\AddinScout\Project\AddinScout.csproj", "{4B8F0F98-8BE1-402B-AA8B-C8D548577B38}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.AddIn", "AddIns\DisplayBindings\WpfDesign\WpfDesign.AddIn\WpfDesign.AddIn.csproj", "{9A9D6FD4-6A2E-455D-ACC3-DDA775FE9865}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartPage", "AddIns\Misc\StartPage\Project\StartPage.csproj", "{7D5C266F-D6FF-4D14-B315-0C0FC6C4EF51}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.XamlDom", "AddIns\DisplayBindings\WpfDesign\WpfDesign.XamlDom\Project\WpfDesign.XamlDom.csproj", "{88DA149F-21B2-48AB-82C4-28FB6BDFD783}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RegExpTk", "AddIns\Misc\RegExpTk\Project\RegExpTk.csproj", "{64A3E5E6-90BF-47F6-94DF-68C94B62C817}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.Designer", "AddIns\DisplayBindings\WpfDesign\WpfDesign.Designer\Project\WpfDesign.Designer.csproj", "{78CC29AC-CC79-4355-B1F2-97936DF198AC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HighlightingEditor", "AddIns\Misc\HighlightingEditor\Project\HighlightingEditor.csproj", "{8A462940-E5E9-4E85-982D-D4C006EE31D4}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign", "AddIns\DisplayBindings\WpfDesign\WpfDesign\Project\WpfDesign.csproj", "{66A378A1-E9F4-4AD5-8946-D0EC06C2902F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FiletypeRegisterer", "AddIns\Misc\FiletypeRegisterer\Project\FiletypeRegisterer.csproj", "{D022A6CE-7438-41E8-AC64-F2DE18EC54C6}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkflowDesigner", "AddIns\DisplayBindings\WorkflowDesigner\Project\WorkflowDesigner.csproj", "{533F4684-DBA6-4518-B005-C84F22A2DD57}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debugger", "Debugger", "{6604365C-C702-4C10-9BA8-637F1E3D4D0D}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ClassDiagram", "ClassDiagram", "{DB137F0B-9B62-4232-AE92-F7BE0280B8D3}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TreeListView", "AddIns\Misc\Debugger\TreeListView\Project\TreeListView.csproj", "{B08385CD-F0CC-488C-B4F4-EEB34B6D2688}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassWizard", "AddIns\DisplayBindings\ClassDiagram\ClassWizard\ClassWizard.csproj", "{8C59E80D-C4E4-4F36-9AD8-47C40F6E58B4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.Core", "AddIns\Misc\Debugger\Debugger.Core\Project\Debugger.Core.csproj", "{1D18D788-F7EE-4585-A23B-34DC8EC63CB8}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Diagrams", "AddIns\DisplayBindings\ClassDiagram\DiagramRouter\Diagrams.csproj", "{0991423A-DBF6-4C89-B365-A1DF1EB32E42}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.AddIn", "AddIns\Misc\Debugger\Debugger.AddIn\Project\Debugger.AddIn.csproj", "{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassDiagramAddin", "AddIns\DisplayBindings\ClassDiagram\ClassDiagramAddin\ClassDiagramAddin.csproj", "{5A1354DF-4989-4BB4-BC6B-D627C2E9FA13}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlHelp2", "AddIns\Misc\HtmlHelp2\Project\HtmlHelp2.csproj", "{918487B7-2153-4618-BBB3-344DBDDF2A2A}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassEditor", "AddIns\DisplayBindings\ClassDiagram\ClassEditor\ClassEditor.csproj", "{F5E059BB-96C2-4398-BED0-8598CD434173}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddInManager", "AddIns\Misc\AddInManager\Project\AddInManager.csproj", "{F93E52FD-DA66-4CE5-A0CB-BCD902811122}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassCanvas", "AddIns\DisplayBindings\ClassDiagram\ClassCanvas\ClassCanvas.csproj", "{08F772A1-F0BE-433E-8B37-F6522953DB05}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PInvokeAddIn", "AddIns\Misc\PInvokeAddIn\Project\PInvokeAddIn.csproj", "{5EEB99CF-EA2B-4733-80A6-CE9192D68170}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SettingsEditor", "AddIns\DisplayBindings\SettingsEditor\Project\SettingsEditor.csproj", "{85226AFB-CE71-4851-9A75-7EEC663A8E8A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoAddIn", "AddIns\Misc\MonoAddIn\Project\MonoAddIn.csproj", "{082DCD64-EE32-4151-A50F-E139CF754CC0}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IconEditor", "IconEditor", "{0D37CE59-B0EF-4F3C-B9EB-8557E53A448B}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage", "AddIns\Misc\CodeCoverage\Project\CodeCoverage.csproj", "{08ce9972-283b-44f4-82fa-966f7dfa6b7a}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IconEditorAddIn", "AddIns\DisplayBindings\IconEditor\IconEditorAddIn\IconEditorAddIn.csproj", "{DFB936AD-90EE-4B4F-941E-4F4A636F0D92}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting", "AddIns\Misc\UnitTesting\UnitTesting.csproj", "{1F261725-6318-4434-A1B1-6C70CE4CD324}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IconEditor", "AddIns\DisplayBindings\IconEditor\IconEditor\IconEditor.csproj", "{DC1CCE11-CB91-40FA-9C47-4D9EB5D67BFD}"
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "HtmlHelp2JScriptGlobals", "AddIns\Misc\HtmlHelp2\JScriptGlobals\HtmlHelp2JScriptGlobals.vbproj", "{E54A5AD2-418D-4A85-BA5E-CD803DE38715}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XmlEditor", "AddIns\DisplayBindings\XmlEditor\Project\XmlEditor.csproj", "{6B717BD1-CD5E-498C-A42E-9E6A4584DC48}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubversionAddIn", "AddIns\Misc\SubversionAddIn\Project\SubversionAddIn.csproj", "{17F4D7E0-6933-4C2E-8714-FD7E98D625D5}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsDesigner", "AddIns\DisplayBindings\FormsDesigner\Project\FormsDesigner.csproj", "{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeAnalysis", "AddIns\Misc\CodeAnalysis\CodeAnalysis.csproj", "{3EAA45A9-735C-4AC7-A799-947B93EA449D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceEditor", "AddIns\DisplayBindings\ResourceEditor\Project\ResourceEditor.csproj", "{CBC6C247-747B-4908-B09A-4D2E0F640B6B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ComponentInspector", "ComponentInspector", "{BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Backends", "Backends", "{FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector", "AddIns\Misc\ComponentInspector\ComponentInspector\ComponentInspector.csproj", "{000E4F64-5D0D-4EB1-B0BF-1A62ADBC6EAD}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlBinding", "AddIns\BackendBindings\XamlBinding\Project\XamlBinding.csproj", "{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector.AddIn", "AddIns\Misc\ComponentInspector\ComponentInspector.AddIn\ComponentInspector.AddIn.csproj", "{869951D5-A0D6-4DC6-9F1D-E6B9A12AC446}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixBinding", "AddIns\BackendBindings\WixBinding\Project\WixBinding.csproj", "{e1b288a2-08ee-4318-8bbb-8ab72c69e33e}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector.Core", "AddIns\Misc\ComponentInspector\ComponentInspector.Core\ComponentInspector.Core.csproj", "{E6F4983F-DE41-4AEC-88E7-1FA9AFB4E6FF}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryToBooConverter", "AddIns\BackendBindings\Boo\NRefactoryToBooConverter\Project\NRefactoryToBooConverter.csproj", "{DBCF20A1-BA13-4582-BFA9-74DE4D987B73}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceToolkit", "AddIns\Misc\ResourceToolkit\Project\ResourceToolkit.csproj", "{461606BD-E824-4D0A-8CBA-01810B1F5E02}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding", "AddIns\BackendBindings\Boo\BooBinding\Project\BooBinding.csproj", "{4AC2D5F1-F671-480C-A075-6BF62B3721B2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ILAsmBinding", "AddIns\BackendBindings\ILAsmBinding\Project\ILAsmBinding.csproj", "{6e59af58-f635-459a-9a35-c9ac41c00339}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VBNetBinding", "AddIns\BackendBindings\VBNetBinding\Project\VBNetBinding.csproj", "{BF38FB72-B380-4196-AF8C-95749D726C61}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpBinding", "AddIns\BackendBindings\CSharpBinding\Project\CSharpBinding.csproj", "{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Misc", "Misc", "{CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SharpServerTools", "SharpServerTools", "{6CEEC0D9-FA00-4EE3-9A1C-39B7ACC882FD}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerBrowserTool", "AddIns\Misc\SharpServerTools\ServerBrowserTool\ServerBrowserTool.csproj", "{D721EAA4-8A40-4EF0-A011-5862159BE621}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataTools.UI", "AddIns\Misc\SharpServerTools\DataTools.UI\DataTools.UI.csproj", "{87C0E3D9-0DFD-4F6D-8E38-408AAF73F4EE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataTools.Model", "AddIns\Misc\SharpServerTools\DataTools.Model\DataTools.Model.csproj", "{51783FC4-D8D2-4BFB-A1F1-AC8857CF3ED0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataTools.AddIn", "AddIns\Misc\SharpServerTools\SharpDbTools\DataTools.AddIn.csproj", "{93B2D6DF-7588-40C0-8A35-CA0DD7328FC3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataTools.Model", "AddIns\Misc\SharpServerTools\DataTools.Model\DataTools.Model.csproj", "{51783FC4-D8D2-4BFB-A1F1-AC8857CF3ED0}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerBrowserTool", "AddIns\Misc\SharpServerTools\ServerBrowserTool\ServerBrowserTool.csproj", "{D721EAA4-8A40-4EF0-A011-5862159BE621}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataTools.UI", "AddIns\Misc\SharpServerTools\DataTools.UI\DataTools.UI.csproj", "{87C0E3D9-0DFD-4F6D-8E38-408AAF73F4EE}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceToolkit", "AddIns\Misc\ResourceToolkit\Project\ResourceToolkit.csproj", "{461606BD-E824-4D0A-8CBA-01810B1F5E02}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Backends", "Backends", "{FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ComponentInspector", "ComponentInspector", "{BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpBinding", "AddIns\BackendBindings\CSharpBinding\Project\CSharpBinding.csproj", "{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VBNetBinding", "AddIns\BackendBindings\VBNetBinding\Project\VBNetBinding.csproj", "{BF38FB72-B380-4196-AF8C-95749D726C61}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ILAsmBinding", "AddIns\BackendBindings\ILAsmBinding\Project\ILAsmBinding.csproj", "{6e59af58-f635-459a-9a35-c9ac41c00339}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding", "AddIns\BackendBindings\Boo\BooBinding\Project\BooBinding.csproj", "{4AC2D5F1-F671-480C-A075-6BF62B3721B2}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector.Core", "AddIns\Misc\ComponentInspector\ComponentInspector.Core\ComponentInspector.Core.csproj", "{E6F4983F-DE41-4AEC-88E7-1FA9AFB4E6FF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryToBooConverter", "AddIns\BackendBindings\Boo\NRefactoryToBooConverter\Project\NRefactoryToBooConverter.csproj", "{DBCF20A1-BA13-4582-BFA9-74DE4D987B73}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector.AddIn", "AddIns\Misc\ComponentInspector\ComponentInspector.AddIn\ComponentInspector.AddIn.csproj", "{869951D5-A0D6-4DC6-9F1D-E6B9A12AC446}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixBinding", "AddIns\BackendBindings\WixBinding\Project\WixBinding.csproj", "{e1b288a2-08ee-4318-8bbb-8ab72c69e33e}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector", "AddIns\Misc\ComponentInspector\ComponentInspector\ComponentInspector.csproj", "{000E4F64-5D0D-4EB1-B0BF-1A62ADBC6EAD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlBinding", "AddIns\BackendBindings\XamlBinding\Project\XamlBinding.csproj", "{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeAnalysis", "AddIns\Misc\CodeAnalysis\CodeAnalysis.csproj", "{3EAA45A9-735C-4AC7-A799-947B93EA449D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Display Bindings", "Display Bindings", "{4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubversionAddIn", "AddIns\Misc\SubversionAddIn\Project\SubversionAddIn.csproj", "{17F4D7E0-6933-4C2E-8714-FD7E98D625D5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceEditor", "AddIns\DisplayBindings\ResourceEditor\Project\ResourceEditor.csproj", "{CBC6C247-747B-4908-B09A-4D2E0F640B6B}"
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "HtmlHelp2JScriptGlobals", "AddIns\Misc\HtmlHelp2\JScriptGlobals\HtmlHelp2JScriptGlobals.vbproj", "{E54A5AD2-418D-4A85-BA5E-CD803DE38715}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsDesigner", "AddIns\DisplayBindings\FormsDesigner\Project\FormsDesigner.csproj", "{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting", "AddIns\Misc\UnitTesting\UnitTesting.csproj", "{1F261725-6318-4434-A1B1-6C70CE4CD324}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XmlEditor", "AddIns\DisplayBindings\XmlEditor\Project\XmlEditor.csproj", "{6B717BD1-CD5E-498C-A42E-9E6A4584DC48}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage", "AddIns\Misc\CodeCoverage\Project\CodeCoverage.csproj", "{08ce9972-283b-44f4-82fa-966f7dfa6b7a}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IconEditor", "IconEditor", "{0D37CE59-B0EF-4F3C-B9EB-8557E53A448B}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoAddIn", "AddIns\Misc\MonoAddIn\Project\MonoAddIn.csproj", "{082DCD64-EE32-4151-A50F-E139CF754CC0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IconEditor", "AddIns\DisplayBindings\IconEditor\IconEditor\IconEditor.csproj", "{DC1CCE11-CB91-40FA-9C47-4D9EB5D67BFD}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PInvokeAddIn", "AddIns\Misc\PInvokeAddIn\Project\PInvokeAddIn.csproj", "{5EEB99CF-EA2B-4733-80A6-CE9192D68170}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IconEditorAddIn", "AddIns\DisplayBindings\IconEditor\IconEditorAddIn\IconEditorAddIn.csproj", "{DFB936AD-90EE-4B4F-941E-4F4A636F0D92}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddInManager", "AddIns\Misc\AddInManager\Project\AddInManager.csproj", "{F93E52FD-DA66-4CE5-A0CB-BCD902811122}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SettingsEditor", "AddIns\DisplayBindings\SettingsEditor\Project\SettingsEditor.csproj", "{85226AFB-CE71-4851-9A75-7EEC663A8E8A}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlHelp2", "AddIns\Misc\HtmlHelp2\Project\HtmlHelp2.csproj", "{918487B7-2153-4618-BBB3-344DBDDF2A2A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ClassDiagram", "ClassDiagram", "{DB137F0B-9B62-4232-AE92-F7BE0280B8D3}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debugger", "Debugger", "{6604365C-C702-4C10-9BA8-637F1E3D4D0D}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassCanvas", "AddIns\DisplayBindings\ClassDiagram\ClassCanvas\ClassCanvas.csproj", "{08F772A1-F0BE-433E-8B37-F6522953DB05}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassEditor", "AddIns\DisplayBindings\ClassDiagram\ClassEditor\ClassEditor.csproj", "{F5E059BB-96C2-4398-BED0-8598CD434173}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassDiagramAddin", "AddIns\DisplayBindings\ClassDiagram\ClassDiagramAddin\ClassDiagramAddin.csproj", "{5A1354DF-4989-4BB4-BC6B-D627C2E9FA13}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.AddIn", "AddIns\Misc\Debugger\Debugger.AddIn\Project\Debugger.AddIn.csproj", "{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Diagrams", "AddIns\DisplayBindings\ClassDiagram\DiagramRouter\Diagrams.csproj", "{0991423A-DBF6-4C89-B365-A1DF1EB32E42}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.Core", "AddIns\Misc\Debugger\Debugger.Core\Project\Debugger.Core.csproj", "{1D18D788-F7EE-4585-A23B-34DC8EC63CB8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassWizard", "AddIns\DisplayBindings\ClassDiagram\ClassWizard\ClassWizard.csproj", "{8C59E80D-C4E4-4F36-9AD8-47C40F6E58B4}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TreeListView", "AddIns\Misc\Debugger\TreeListView\Project\TreeListView.csproj", "{B08385CD-F0CC-488C-B4F4-EEB34B6D2688}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkflowDesigner", "AddIns\DisplayBindings\WorkflowDesigner\Project\WorkflowDesigner.csproj", "{533F4684-DBA6-4518-B005-C84F22A2DD57}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FiletypeRegisterer", "AddIns\Misc\FiletypeRegisterer\Project\FiletypeRegisterer.csproj", "{D022A6CE-7438-41E8-AC64-F2DE18EC54C6}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WpfDesign", "WpfDesign", "{388C3979-2621-4839-A955-7E5C03BA0B63}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HighlightingEditor", "AddIns\Misc\HighlightingEditor\Project\HighlightingEditor.csproj", "{8A462940-E5E9-4E85-982D-D4C006EE31D4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign", "AddIns\DisplayBindings\WpfDesign\WpfDesign\Project\WpfDesign.csproj", "{66A378A1-E9F4-4AD5-8946-D0EC06C2902F}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RegExpTk", "AddIns\Misc\RegExpTk\Project\RegExpTk.csproj", "{64A3E5E6-90BF-47F6-94DF-68C94B62C817}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.Designer", "AddIns\DisplayBindings\WpfDesign\WpfDesign.Designer\Project\WpfDesign.Designer.csproj", "{78CC29AC-CC79-4355-B1F2-97936DF198AC}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartPage", "AddIns\Misc\StartPage\Project\StartPage.csproj", "{7D5C266F-D6FF-4D14-B315-0C0FC6C4EF51}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.XamlDom", "AddIns\DisplayBindings\WpfDesign\WpfDesign.XamlDom\Project\WpfDesign.XamlDom.csproj", "{88DA149F-21B2-48AB-82C4-28FB6BDFD783}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddinScout", "AddIns\Misc\AddinScout\Project\AddinScout.csproj", "{4B8F0F98-8BE1-402B-AA8B-C8D548577B38}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.AddIn", "AddIns\DisplayBindings\WpfDesign\WpfDesign.AddIn\WpfDesign.AddIn.csproj", "{9A9D6FD4-6A2E-455D-ACC3-DDA775FE9865}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SearchAndReplace", "AddIns\Misc\SearchAndReplace\Project\SearchAndReplace.csproj", "{9196DD8A-B4D4-4780-8742-C5762E547FC2}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{9421EDF4-9769-4BE9-B5A6-C87DE221D73C}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactory", "Libraries\NRefactory\Project\NRefactory.csproj", "{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Aga.Controls", "Libraries\TreeViewAdv\Aga.Controls\Aga.Controls.csproj", "{E73BB233-D88B-44A7-A98F-D71EE158381D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor", "Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Build.Tasks", "Libraries\ICSharpCode.Build.Tasks\Project\ICSharpCode.Build.Tasks.csproj", "{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinFormsUI", "Libraries\DockPanel_Src\WinFormsUI\WinFormsUI.csproj", "{D3C782BA-178E-4235-A3BA-8C11DEBB6BEE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Build.Tasks", "Libraries\ICSharpCode.Build.Tasks\Project\ICSharpCode.Build.Tasks.csproj", "{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor", "Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Aga.Controls", "Libraries\TreeViewAdv\Aga.Controls\Aga.Controls.csproj", "{E73BB233-D88B-44A7-A98F-D71EE158381D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactory", "Libraries\NRefactory\Project\NRefactory.csproj", "{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Main", "Main", "{5A3EBEBA-0560-41C1-966B-23F7D03A5486}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{00000000-0000-0000-0000-000000000000}") = "Tools", "Tools\Tools.build", "B13EFF7F-7EA4-4B68-A375-D112105E9182"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Dom", "Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj", "{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartUp", "Main\StartUp\Project\StartUp.csproj", "{1152B71B-3C05-4598-B20D-823B5D40559E}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Widgets", "Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj", "{8035765F-D51F-4A0C-A746-2FD100E19419}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "Main\Core\Project\ICSharpCode.Core.csproj", "{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Sda", "Main\ICSharpCode.SharpDevelop.Sda\ICSharpCode.SharpDevelop.Sda.csproj", "{80318B5F-A25D-45AB-8A95-EF31D2370A4C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop", "Main\Base\Project\ICSharpCode.SharpDevelop.csproj", "{2748AD25-9C63-4E12-877B-4DCE96FBED54}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Sda", "Main\ICSharpCode.SharpDevelop.Sda\ICSharpCode.SharpDevelop.Sda.csproj", "{80318B5F-A25D-45AB-8A95-EF31D2370A4C}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "Main\Core\Project\ICSharpCode.Core.csproj", "{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Widgets", "Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj", "{8035765F-D51F-4A0C-A746-2FD100E19419}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartUp", "Main\StartUp\Project\StartUp.csproj", "{1152B71B-3C05-4598-B20D-823B5D40559E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Dom", "Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj", "{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}"
Project("{00000000-0000-0000-0000-000000000000}") = "Tools", "Tools\Tools.build", "B13EFF7F-7EA4-4B68-A375-D112105E9182"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.BuildWorker", "Main\ICSharpCode.SharpDevelop.BuildWorker\ICSharpCode.SharpDevelop.BuildWorker.csproj", "{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -502,77 +504,82 @@ Global @@ -502,77 +504,82 @@ Global
{9196DD8A-B4D4-4780-8742-C5762E547FC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9196DD8A-B4D4-4780-8742-C5762E547FC2}.Release|Any CPU.Build.0 = Release|Any CPU
{9196DD8A-B4D4-4780-8742-C5762E547FC2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Release|Any CPU.Build.0 = Release|Any CPU
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Release|Any CPU.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{4EA396ED-64AD-4AD0-A67A-AB363F3E0C79} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{CE5B42B7-6E8C-4385-9E97-F4023FC16BF2} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{6CEEC0D9-FA00-4EE3-9A1C-39B7ACC882FD} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{461606BD-E824-4D0A-8CBA-01810B1F5E02} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{3EAA45A9-735C-4AC7-A799-947B93EA449D} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{17F4D7E0-6933-4C2E-8714-FD7E98D625D5} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{E54A5AD2-418D-4A85-BA5E-CD803DE38715} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{1F261725-6318-4434-A1B1-6C70CE4CD324} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{08ce9972-283b-44f4-82fa-966f7dfa6b7a} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{082DCD64-EE32-4151-A50F-E139CF754CC0} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{5EEB99CF-EA2B-4733-80A6-CE9192D68170} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{F93E52FD-DA66-4CE5-A0CB-BCD902811122} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{918487B7-2153-4618-BBB3-344DBDDF2A2A} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{6604365C-C702-4C10-9BA8-637F1E3D4D0D} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{D022A6CE-7438-41E8-AC64-F2DE18EC54C6} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{8A462940-E5E9-4E85-982D-D4C006EE31D4} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{64A3E5E6-90BF-47F6-94DF-68C94B62C817} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{7D5C266F-D6FF-4D14-B315-0C0FC6C4EF51} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{4B8F0F98-8BE1-402B-AA8B-C8D548577B38} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{9196DD8A-B4D4-4780-8742-C5762E547FC2} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{1D18D788-F7EE-4585-A23B-34DC8EC63CB8} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{B08385CD-F0CC-488C-B4F4-EEB34B6D2688} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{E6F4983F-DE41-4AEC-88E7-1FA9AFB4E6FF} = {BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C}
{869951D5-A0D6-4DC6-9F1D-E6B9A12AC446} = {BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C}
{000E4F64-5D0D-4EB1-B0BF-1A62ADBC6EAD} = {BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C}
{87C0E3D9-0DFD-4F6D-8E38-408AAF73F4EE} = {6CEEC0D9-FA00-4EE3-9A1C-39B7ACC882FD}
{51783FC4-D8D2-4BFB-A1F1-AC8857CF3ED0} = {6CEEC0D9-FA00-4EE3-9A1C-39B7ACC882FD}
{93B2D6DF-7588-40C0-8A35-CA0DD7328FC3} = {6CEEC0D9-FA00-4EE3-9A1C-39B7ACC882FD}
{D721EAA4-8A40-4EF0-A011-5862159BE621} = {6CEEC0D9-FA00-4EE3-9A1C-39B7ACC882FD}
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{e1b288a2-08ee-4318-8bbb-8ab72c69e33e} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{DBCF20A1-BA13-4582-BFA9-74DE4D987B73} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{4AC2D5F1-F671-480C-A075-6BF62B3721B2} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{6e59af58-f635-459a-9a35-c9ac41c00339} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{BF38FB72-B380-4196-AF8C-95749D726C61} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{388C3979-2621-4839-A955-7E5C03BA0B63} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{533F4684-DBA6-4518-B005-C84F22A2DD57} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{DB137F0B-9B62-4232-AE92-F7BE0280B8D3} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{85226AFB-CE71-4851-9A75-7EEC663A8E8A} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{0D37CE59-B0EF-4F3C-B9EB-8557E53A448B} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{6B717BD1-CD5E-498C-A42E-9E6A4584DC48} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{4EA396ED-64AD-4AD0-A67A-AB363F3E0C79} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{CBC6C247-747B-4908-B09A-4D2E0F640B6B} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{DFB936AD-90EE-4B4F-941E-4F4A636F0D92} = {0D37CE59-B0EF-4F3C-B9EB-8557E53A448B}
{DC1CCE11-CB91-40FA-9C47-4D9EB5D67BFD} = {0D37CE59-B0EF-4F3C-B9EB-8557E53A448B}
{8C59E80D-C4E4-4F36-9AD8-47C40F6E58B4} = {DB137F0B-9B62-4232-AE92-F7BE0280B8D3}
{0991423A-DBF6-4C89-B365-A1DF1EB32E42} = {DB137F0B-9B62-4232-AE92-F7BE0280B8D3}
{5A1354DF-4989-4BB4-BC6B-D627C2E9FA13} = {DB137F0B-9B62-4232-AE92-F7BE0280B8D3}
{F5E059BB-96C2-4398-BED0-8598CD434173} = {DB137F0B-9B62-4232-AE92-F7BE0280B8D3}
{08F772A1-F0BE-433E-8B37-F6522953DB05} = {DB137F0B-9B62-4232-AE92-F7BE0280B8D3}
{9A9D6FD4-6A2E-455D-ACC3-DDA775FE9865} = {388C3979-2621-4839-A955-7E5C03BA0B63}
{88DA149F-21B2-48AB-82C4-28FB6BDFD783} = {388C3979-2621-4839-A955-7E5C03BA0B63}
{78CC29AC-CC79-4355-B1F2-97936DF198AC} = {388C3979-2621-4839-A955-7E5C03BA0B63}
{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{6B717BD1-CD5E-498C-A42E-9E6A4584DC48} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{0D37CE59-B0EF-4F3C-B9EB-8557E53A448B} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{85226AFB-CE71-4851-9A75-7EEC663A8E8A} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{DB137F0B-9B62-4232-AE92-F7BE0280B8D3} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{533F4684-DBA6-4518-B005-C84F22A2DD57} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{388C3979-2621-4839-A955-7E5C03BA0B63} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{66A378A1-E9F4-4AD5-8946-D0EC06C2902F} = {388C3979-2621-4839-A955-7E5C03BA0B63}
{E73BB233-D88B-44A7-A98F-D71EE158381D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{D3C782BA-178E-4235-A3BA-8C11DEBB6BEE} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{78CC29AC-CC79-4355-B1F2-97936DF198AC} = {388C3979-2621-4839-A955-7E5C03BA0B63}
{88DA149F-21B2-48AB-82C4-28FB6BDFD783} = {388C3979-2621-4839-A955-7E5C03BA0B63}
{9A9D6FD4-6A2E-455D-ACC3-DDA775FE9865} = {388C3979-2621-4839-A955-7E5C03BA0B63}
{08F772A1-F0BE-433E-8B37-F6522953DB05} = {DB137F0B-9B62-4232-AE92-F7BE0280B8D3}
{F5E059BB-96C2-4398-BED0-8598CD434173} = {DB137F0B-9B62-4232-AE92-F7BE0280B8D3}
{5A1354DF-4989-4BB4-BC6B-D627C2E9FA13} = {DB137F0B-9B62-4232-AE92-F7BE0280B8D3}
{0991423A-DBF6-4C89-B365-A1DF1EB32E42} = {DB137F0B-9B62-4232-AE92-F7BE0280B8D3}
{8C59E80D-C4E4-4F36-9AD8-47C40F6E58B4} = {DB137F0B-9B62-4232-AE92-F7BE0280B8D3}
{DC1CCE11-CB91-40FA-9C47-4D9EB5D67BFD} = {0D37CE59-B0EF-4F3C-B9EB-8557E53A448B}
{DFB936AD-90EE-4B4F-941E-4F4A636F0D92} = {0D37CE59-B0EF-4F3C-B9EB-8557E53A448B}
{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{BF38FB72-B380-4196-AF8C-95749D726C61} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{6e59af58-f635-459a-9a35-c9ac41c00339} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{4AC2D5F1-F671-480C-A075-6BF62B3721B2} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{DBCF20A1-BA13-4582-BFA9-74DE4D987B73} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{e1b288a2-08ee-4318-8bbb-8ab72c69e33e} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{9196DD8A-B4D4-4780-8742-C5762E547FC2} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{4B8F0F98-8BE1-402B-AA8B-C8D548577B38} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{7D5C266F-D6FF-4D14-B315-0C0FC6C4EF51} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{64A3E5E6-90BF-47F6-94DF-68C94B62C817} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{8A462940-E5E9-4E85-982D-D4C006EE31D4} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{D022A6CE-7438-41E8-AC64-F2DE18EC54C6} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{6604365C-C702-4C10-9BA8-637F1E3D4D0D} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{918487B7-2153-4618-BBB3-344DBDDF2A2A} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{F93E52FD-DA66-4CE5-A0CB-BCD902811122} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{5EEB99CF-EA2B-4733-80A6-CE9192D68170} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{082DCD64-EE32-4151-A50F-E139CF754CC0} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{08ce9972-283b-44f4-82fa-966f7dfa6b7a} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{1F261725-6318-4434-A1B1-6C70CE4CD324} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{E54A5AD2-418D-4A85-BA5E-CD803DE38715} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{17F4D7E0-6933-4C2E-8714-FD7E98D625D5} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{3EAA45A9-735C-4AC7-A799-947B93EA449D} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{461606BD-E824-4D0A-8CBA-01810B1F5E02} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{6CEEC0D9-FA00-4EE3-9A1C-39B7ACC882FD} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{D721EAA4-8A40-4EF0-A011-5862159BE621} = {6CEEC0D9-FA00-4EE3-9A1C-39B7ACC882FD}
{93B2D6DF-7588-40C0-8A35-CA0DD7328FC3} = {6CEEC0D9-FA00-4EE3-9A1C-39B7ACC882FD}
{51783FC4-D8D2-4BFB-A1F1-AC8857CF3ED0} = {6CEEC0D9-FA00-4EE3-9A1C-39B7ACC882FD}
{87C0E3D9-0DFD-4F6D-8E38-408AAF73F4EE} = {6CEEC0D9-FA00-4EE3-9A1C-39B7ACC882FD}
{000E4F64-5D0D-4EB1-B0BF-1A62ADBC6EAD} = {BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C}
{869951D5-A0D6-4DC6-9F1D-E6B9A12AC446} = {BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C}
{E6F4983F-DE41-4AEC-88E7-1FA9AFB4E6FF} = {BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C}
{B08385CD-F0CC-488C-B4F4-EEB34B6D2688} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{1D18D788-F7EE-4585-A23B-34DC8EC63CB8} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{924EE450-603D-49C1-A8E5-4AFAA31CE6F3} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{8035765F-D51F-4A0C-A746-2FD100E19419} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{80318B5F-A25D-45AB-8A95-EF31D2370A4C} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{2748AD25-9C63-4E12-877B-4DCE96FBED54} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{1152B71B-3C05-4598-B20D-823B5D40559E} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{D3C782BA-178E-4235-A3BA-8C11DEBB6BEE} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{E73BB233-D88B-44A7-A98F-D71EE158381D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
B13EFF7F-7EA4-4B68-A375-D112105E9182 = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{1152B71B-3C05-4598-B20D-823B5D40559E} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{2748AD25-9C63-4E12-877B-4DCE96FBED54} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{80318B5F-A25D-45AB-8A95-EF31D2370A4C} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{8035765F-D51F-4A0C-A746-2FD100E19419} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{924EE450-603D-49C1-A8E5-4AFAA31CE6F3} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
EndGlobalSection
EndGlobal

Loading…
Cancel
Save