Browse Source

Use external BuildWorker process for compilation. Use MSBuild 3.5 for compiling projects with ToolsVersion<"4.0".

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5641 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Daniel Grunwald 16 years ago
parent
commit
3399fb59c1
  1. 546
      SharpDevelop.Tests.sln
  2. 30
      SharpDevelop.sln
  3. 5
      src/Libraries/AvalonDock/AvalonDock.csproj
  4. 3
      src/Libraries/ICSharpCode.Build.Tasks/Project/ICSharpCode.Build.Tasks.csproj
  5. 3
      src/Libraries/TreeViewAdv/Aga.Controls/Aga.Controls.csproj
  6. 23
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  7. 184
      src/Main/Base/Project/Src/Project/MSBuildEngine/BuildWorkerManager.cs
  8. 83
      src/Main/Base/Project/Src/Project/MSBuildEngine/EventSource.cs
  9. 116
      src/Main/Base/Project/Src/Project/MSBuildEngine/MSBuildEngine.cs
  10. 242
      src/Main/Base/Project/Src/Project/MSBuildEngine/ParallelMSBuildManager.cs
  11. 128
      src/Main/Base/Project/Src/Project/MSBuildEngine/WorkerProcess.cs
  12. 10
      src/Main/Base/Project/Src/Project/MSBuildInternals.cs
  13. 60
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/BuildJob.cs
  14. 167
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/EventSource.cs
  15. 32
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/EventTypes.cs
  16. 45
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/ExtendedBinaryReader.cs
  17. 53
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/HostProcess.cs
  18. 25
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/ICSharpCode.SharpDevelop.BuildWorker.csproj
  19. 112
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/HostProcess.cs
  20. 16
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/IHostObject.cs
  21. 148
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/PacketReceiver.cs
  22. 70
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/PacketSender.cs
  23. 270
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/Interprocess/WorkerProcess.cs
  24. 39
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/MSBuild40.cs
  25. 224
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/Program.cs
  26. 274
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/WorkerManager.cs
  27. 10
      src/Main/ICSharpCode.SharpDevelop.BuildWorker/app.config
  28. 78
      src/Main/ICSharpCode.SharpDevelop.BuildWorker35/ICSharpCode.SharpDevelop.BuildWorker35.csproj
  29. 46
      src/Main/ICSharpCode.SharpDevelop.BuildWorker35/MSBuild35.cs
  30. 17
      src/Main/ICSharpCode.SharpDevelop.BuildWorker35/Properties/AssemblyInfo.cs
  31. 15
      src/Main/ICSharpCode.SharpDevelop.BuildWorker35/app.config
  32. 12
      src/Setup/Files.wxs
  33. 2
      src/Setup/Setup.wxs

546
SharpDevelop.Tests.sln

@ -1,29 +1,32 @@ @@ -1,29 +1,32 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
# SharpDevelop 4.0.0.5490
# SharpDevelop 4.0.0.5639
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Main", "Main", "{256F5C28-532C-44C0-8AB8-D8EC5E492E01}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Dom.Tests", "src\Main\ICSharpCode.SharpDevelop.Dom\Tests\ICSharpCode.SharpDevelop.Dom.Tests\ICSharpCode.SharpDevelop.Dom.Tests.csproj", "{7DB80259-24D4-46C3-A024-53FF1987733D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartUp", "src\Main\StartUp\Project\StartUp.csproj", "{1152B71B-3C05-4598-B20D-823B5D40559E}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Tests", "src\Main\Base\Test\ICSharpCode.SharpDevelop.Tests.csproj", "{4980B743-B32F-4aba-AABD-45E2CAD3568D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Widgets", "src\Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj", "{8035765F-D51F-4A0C-A746-2FD100E19419}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.Tests", "src\Main\Core\Test\ICSharpCode.Core.Tests.csproj", "{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop", "src\Main\Base\Project\ICSharpCode.SharpDevelop.csproj", "{2748AD25-9C63-4E12-877B-4DCE96FBED54}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "src\Main\Core\Project\ICSharpCode.Core.csproj", "{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Sda", "src\Main\ICSharpCode.SharpDevelop.Sda\ICSharpCode.SharpDevelop.Sda.csproj", "{80318B5F-A25D-45AB-8A95-EF31D2370A4C}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.Presentation", "src\Main\ICSharpCode.Core.Presentation\ICSharpCode.Core.Presentation.csproj", "{7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Dom", "src\Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj", "{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
@ -33,27 +36,34 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.WinForms", @@ -33,27 +36,34 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.WinForms",
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Dom", "src\Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj", "{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.Presentation", "src\Main\ICSharpCode.Core.Presentation\ICSharpCode.Core.Presentation.csproj", "{7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Sda", "src\Main\ICSharpCode.SharpDevelop.Sda\ICSharpCode.SharpDevelop.Sda.csproj", "{80318B5F-A25D-45AB-8A95-EF31D2370A4C}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "src\Main\Core\Project\ICSharpCode.Core.csproj", "{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.Tests", "src\Main\Core\Test\ICSharpCode.Core.Tests.csproj", "{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop", "src\Main\Base\Project\ICSharpCode.SharpDevelop.csproj", "{2748AD25-9C63-4E12-877B-4DCE96FBED54}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Tests", "src\Main\Base\Test\ICSharpCode.SharpDevelop.Tests.csproj", "{4980B743-B32F-4aba-AABD-45E2CAD3568D}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Widgets", "src\Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj", "{8035765F-D51F-4A0C-A746-2FD100E19419}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Dom.Tests", "src\Main\ICSharpCode.SharpDevelop.Dom\Tests\ICSharpCode.SharpDevelop.Dom.Tests\ICSharpCode.SharpDevelop.Dom.Tests.csproj", "{7DB80259-24D4-46C3-A024-53FF1987733D}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartUp", "src\Main\StartUp\Project\StartUp.csproj", "{1152B71B-3C05-4598-B20D-823B5D40559E}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.BuildWorker", "src\Main\ICSharpCode.SharpDevelop.BuildWorker\ICSharpCode.SharpDevelop.BuildWorker.csproj", "{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.BuildWorker35", "src\Main\ICSharpCode.SharpDevelop.BuildWorker35\ICSharpCode.SharpDevelop.BuildWorker35.csproj", "{B5F54272-49F0-40DB-845A-8D837875D3BA}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
@ -62,50 +72,50 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{ @@ -62,50 +72,50 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.AvalonEdit.Tests", "src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit.Tests\ICSharpCode.AvalonEdit.Tests.csproj", "{6222A3A1-83CE-47A3-A4E4-A018F82D44D8}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TreeView", "src\Libraries\SharpTreeView\ICSharpCode.TreeView\ICSharpCode.TreeView.csproj", "{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NRefactory", "NRefactory", "{E5A0F4D8-37FD-4A30-BEB0-4409DC4E0865}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Aga.Controls", "src\Libraries\TreeViewAdv\Aga.Controls\Aga.Controls.csproj", "{E73BB233-D88B-44A7-A98F-D71EE158381D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryTests", "src\Libraries\NRefactory\Test\NRefactoryTests.csproj", "{870115DD-960A-4406-A6B9-600BCDC36A03}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor", "src\Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryASTGenerator", "src\Libraries\NRefactory\NRefactoryASTGenerator\NRefactoryASTGenerator.csproj", "{B22522AA-B5BF-4A58-AC6D-D4B45805521F}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Build.Tasks", "src\Libraries\ICSharpCode.Build.Tasks\Project\ICSharpCode.Build.Tasks.csproj", "{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactory", "src\Libraries\NRefactory\Project\NRefactory.csproj", "{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.AvalonEdit", "src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj", "{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvalonDock", "src\Libraries\AvalonDock\AvalonDock.csproj", "{2FF700C2-A38A-48BD-A637-8CAFD4FE6237}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.AvalonEdit", "src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj", "{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NRefactory", "NRefactory", "{E5A0F4D8-37FD-4A30-BEB0-4409DC4E0865}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactory", "src\Libraries\NRefactory\Project\NRefactory.csproj", "{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Build.Tasks", "src\Libraries\ICSharpCode.Build.Tasks\Project\ICSharpCode.Build.Tasks.csproj", "{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryASTGenerator", "src\Libraries\NRefactory\NRefactoryASTGenerator\NRefactoryASTGenerator.csproj", "{B22522AA-B5BF-4A58-AC6D-D4B45805521F}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor", "src\Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryTests", "src\Libraries\NRefactory\Test\NRefactoryTests.csproj", "{870115DD-960A-4406-A6B9-600BCDC36A03}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Aga.Controls", "src\Libraries\TreeViewAdv\Aga.Controls\Aga.Controls.csproj", "{E73BB233-D88B-44A7-A98F-D71EE158381D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TreeView", "src\Libraries\SharpTreeView\ICSharpCode.TreeView\ICSharpCode.TreeView.csproj", "{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.AvalonEdit.Tests", "src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit.Tests\ICSharpCode.AvalonEdit.Tests.csproj", "{6222A3A1-83CE-47A3-A4E4-A018F82D44D8}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
@ -114,228 +124,218 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AddIns", "AddIns", "{393278 @@ -114,228 +124,218 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AddIns", "AddIns", "{393278
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Profiler", "Profiler", "{C4035C32-026F-4158-AF15-113EA1EF1960}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analysis", "Analysis", "{F355E45F-F54F-4B42-8916-9A633A392789}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Profiler.AddIn", "src\AddIns\Misc\Profiler\Frontend\AddIn\Profiler.AddIn.csproj", "{D294A12D-4B38-4F25-9AA6-3D4A6CE26E7B}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting.Tests", "src\AddIns\Misc\UnitTesting\Test\UnitTesting.Tests.csproj", "{44A8DE09-CAB9-49D8-9CFC-5EB0A552F181}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
{FE88FE17-D9FB-4FCC-9A35-6BFFB6B26CC6} = {FE88FE17-D9FB-4FCC-9A35-6BFFB6B26CC6}
{68D5EE3B-0C35-4DF1-BD29-6606851A02C1} = {68D5EE3B-0C35-4DF1-BD29-6606851A02C1}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Profiler.Controls", "src\AddIns\Misc\Profiler\Frontend\Controls\Profiler.Controls.csproj", "{BDA49550-5ED1-4C6B-B648-657B2CACD8E0}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SourceAnalysis", "src\AddIns\Misc\SourceAnalysis\SourceAnalysis.csproj", "{CE498514-D12D-4B6E-AE0E-FEC29BD43748}"
ProjectSection(ProjectDependencies) = postProject
{FE88FE17-D9FB-4FCC-9A35-6BFFB6B26CC6} = {FE88FE17-D9FB-4FCC-9A35-6BFFB6B26CC6}
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Profiler.Controller", "src\AddIns\Misc\Profiler\Controller\Profiler.Controller.csproj", "{72FFB35A-C9E2-4A31-B4FA-E3E3E28DED5F}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage", "src\AddIns\Misc\CodeCoverage\Project\CodeCoverage.csproj", "{08CE9972-283B-44F4-82FA-966F7DFA6B7A}"
ProjectSection(ProjectDependencies) = postProject
{FE88FE17-D9FB-4FCC-9A35-6BFFB6B26CC6} = {FE88FE17-D9FB-4FCC-9A35-6BFFB6B26CC6}
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Profiler.X64Converter", "src\AddIns\Misc\Profiler\X64Converter\Profiler.X64Converter.csproj", "{FE88FE17-D9FB-4FCC-9A35-6BFFB6B26CC6}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeAnalysis", "src\AddIns\Misc\CodeAnalysis\CodeAnalysis.csproj", "{3EAA45A9-735C-4AC7-A799-947B93EA449D}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{0E96FCFA-9DAC-4534-AC18-01A90C368873}") = "Hook", "src\AddIns\Misc\Profiler\Hook\Hook.vcxproj", "{68D5EE3B-0C35-4DF1-BD29-6606851A02C1}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting", "src\AddIns\Misc\UnitTesting\UnitTesting.csproj", "{1F261725-6318-4434-A1B1-6C70CE4CD324}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Profiler.Tests", "src\AddIns\Misc\Profiler\Tests\Profiler.Tests\Profiler.Tests.csproj", "{068F9531-5D29-49E0-980E-59982A3A0469}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage.Tests", "src\AddIns\Misc\CodeCoverage\Test\CodeCoverage.Tests.csproj", "{A5C0E8F8-9D04-46ED-91D6-1DEF1575313B}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Language Bindings", "Language Bindings", "{E0646C25-36F2-4524-969F-FA621353AB94}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ComponentInspector", "ComponentInspector", "{D599885D-E161-4CCE-A66E-7A40C8C4F4CC}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RubyBinding", "src\AddIns\BackendBindings\Ruby\RubyBinding\Project\RubyBinding.csproj", "{C896FFFF-5B6C-4B0E-B6DF-049865F501B4}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector.AddIn", "src\AddIns\Misc\ComponentInspector\ComponentInspector.AddIn\ComponentInspector.AddIn.csproj", "{869951D5-A0D6-4DC6-9F1D-E6B9A12AC446}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CppBinding", "src\AddIns\BackendBindings\CppBinding\CppBinding\CppBinding.csproj", "{70966F84-74C9-4067-A379-0C674A929233}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector.Core", "src\AddIns\Misc\ComponentInspector\ComponentInspector.Core\ComponentInspector.Core.csproj", "{E6F4983F-DE41-4AEC-88E7-1FA9AFB4E6FF}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpBinding.Tests", "src\AddIns\BackendBindings\CSharpBinding\Tests\CSharpBinding.Tests.csproj", "{52006F3F-3156-45DE-89D8-C4813694FBA4}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector", "src\AddIns\Misc\ComponentInspector\ComponentInspector\ComponentInspector.csproj", "{000E4F64-5D0D-4EB1-B0BF-1A62ADBC6EAD}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VBNetBinding.Tests", "src\AddIns\BackendBindings\VBNetBinding\Test\VBNetBinding.Tests.csproj", "{50A89267-A28B-4DF3-8E62-912E005143B8}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Display Bindings", "Display Bindings", "{11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Boo", "Boo", "{97B3B514-AB0E-4FE1-89DE-8A945F5112AE}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WpfDesign", "WpfDesign", "{6022AC51-B658-4C54-97EF-79187AC65B47}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding.Tests", "src\AddIns\BackendBindings\Boo\BooBinding\Test\BooBinding.Tests.csproj", "{6FA16499-896F-4C02-BB43-1AF5C6C7C713}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.XamlDom", "src\AddIns\DisplayBindings\WpfDesign\WpfDesign.XamlDom\Project\WpfDesign.XamlDom.csproj", "{88DA149F-21B2-48AB-82C4-28FB6BDFD783}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding", "src\AddIns\BackendBindings\Boo\BooBinding\Project\BooBinding.csproj", "{4AC2D5F1-F671-480C-A075-6BF62B3721B2}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.Tests", "src\AddIns\DisplayBindings\WpfDesign\WpfDesign.Designer\Tests\WpfDesign.Tests.csproj", "{943DBBB3-E84E-4CF4-917C-C05AFA8743C1}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryToBooConverter", "src\AddIns\BackendBindings\Boo\NRefactoryToBooConverter\Project\NRefactoryToBooConverter.csproj", "{DBCF20A1-BA13-4582-BFA9-74DE4D987B73}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.Designer", "src\AddIns\DisplayBindings\WpfDesign\WpfDesign.Designer\Project\WpfDesign.Designer.csproj", "{78CC29AC-CC79-4355-B1F2-97936DF198AC}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryToBooConverter.Tests", "src\AddIns\BackendBindings\Boo\NRefactoryToBooConverter\Test\NRefactoryToBooConverter.Tests.csproj", "{C9DE556D-325C-4544-B29F-16A9EB7C9830}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.AddIn", "src\AddIns\DisplayBindings\WpfDesign\WpfDesign.AddIn\WpfDesign.AddIn.csproj", "{9A9D6FD4-6A2E-455D-ACC3-DDA775FE9865}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Python", "Python", "{CA76F702-5B4E-4918-B8D8-7FF8382434FF}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PythonBinding.Tests", "src\AddIns\BackendBindings\Python\PythonBinding\Test\PythonBinding.Tests.csproj", "{23B517C9-1ECC-4419-A13F-0B7136D085CB}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign", "src\AddIns\DisplayBindings\WpfDesign\WpfDesign\Project\WpfDesign.csproj", "{66A378A1-E9F4-4AD5-8946-D0EC06C2902F}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Python.Build.Tasks.Tests", "src\AddIns\BackendBindings\Python\Python.Build.Tasks\Test\Python.Build.Tasks.Tests.csproj", "{833904AB-3CD4-4071-9B48-5770E44685AA}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XmlEditor.Tests", "src\AddIns\DisplayBindings\XmlEditor\Test\XmlEditor.Tests.csproj", "{FC0FE702-A87D-4D70-A9B6-1ECCD611125F}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Python.Build.Tasks", "src\AddIns\BackendBindings\Python\Python.Build.Tasks\Project\Python.Build.Tasks.csproj", "{D332F2D1-2CF1-43B7-903C-844BD5211A7E}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IconEditor", "IconEditor", "{0773ED53-08E2-4495-A3BE-CA0B5D413C15}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PythonBinding", "src\AddIns\BackendBindings\Python\PythonBinding\Project\PythonBinding.csproj", "{8D732610-8FC6-43BA-94C9-7126FD7FE361}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IconEditorAddIn", "src\AddIns\DisplayBindings\IconEditor\IconEditorAddIn\IconEditorAddIn.csproj", "{DFB936AD-90EE-4B4F-941E-4F4A636F0D92}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ILAsmBinding", "src\AddIns\BackendBindings\ILAsmBinding\Project\ILAsmBinding.csproj", "{6E59AF58-F635-459A-9A35-C9AC41C00339}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IconEditor", "src\AddIns\DisplayBindings\IconEditor\IconEditor\IconEditor.csproj", "{DC1CCE11-CB91-40FA-9C47-4D9EB5D67BFD}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixBinding", "src\AddIns\BackendBindings\WixBinding\Project\WixBinding.csproj", "{E1B288A2-08EE-4318-8BBB-8AB72C69E33E}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HexEditor", "src\AddIns\DisplayBindings\HexEditor\Project\HexEditor.csproj", "{E618A9CD-A39F-4925-A538-E8A3FEF24E54}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpBinding", "src\AddIns\BackendBindings\CSharpBinding\Project\CSharpBinding.csproj", "{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SettingsEditor", "src\AddIns\DisplayBindings\SettingsEditor\Project\SettingsEditor.csproj", "{85226AFB-CE71-4851-9A75-7EEC663A8E8A}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VBNetBinding", "src\AddIns\BackendBindings\VBNetBinding\Project\VBNetBinding.csproj", "{BF38FB72-B380-4196-AF8C-95749D726C61}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceEditor", "src\AddIns\DisplayBindings\ResourceEditor\Project\ResourceEditor.csproj", "{CBC6C247-747B-4908-B09A-4D2E0F640B6B}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlBinding", "src\AddIns\BackendBindings\XamlBinding\XamlBinding\XamlBinding.csproj", "{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvalonEdit.AddIn", "src\AddIns\DisplayBindings\AvalonEdit.AddIn\AvalonEdit.AddIn.csproj", "{0162E499-42D0-409B-AA25-EED21F75336B}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlBinding.Tests", "src\AddIns\BackendBindings\XamlBinding\XamlBinding.Tests\XamlBinding.Tests.csproj", "{F390DA70-1FE1-4715-81A0-389AB010C130}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XmlEditor", "src\AddIns\DisplayBindings\XmlEditor\Project\XmlEditor.csproj", "{DCA2703D-250A-463E-A68A-07ED105AE6BD}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixBinding.Tests", "src\AddIns\BackendBindings\WixBinding\Test\WixBinding.Tests.csproj", "{388E7B64-0393-4EB4-A3E3-5C474F141853}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsDesigner", "src\AddIns\DisplayBindings\FormsDesigner\Project\FormsDesigner.csproj", "{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FSharpBinding", "src\AddIns\BackendBindings\FSharpBinding\FSharpBinding.csproj", "{E954F3CB-A446-492F-A664-2B376EBC86E8}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debugger", "Debugger", "{CDE0C5A4-2096-48B5-BEA3-74DBA0F0E1EF}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ClassDiagram", "ClassDiagram", "{BFA3BF26-33BD-4A65-B84D-C7F30D131668}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.Tests", "src\AddIns\Debugger\Debugger.Tests\Debugger.Tests.csproj", "{A4C858C8-51B6-4265-A695-A20FCEBA1D19}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassCanvas", "src\AddIns\DisplayBindings\ClassDiagram\ClassCanvas\ClassCanvas.csproj", "{08F772A1-F0BE-433E-8B37-F6522953DB05}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.Core", "src\AddIns\Debugger\Debugger.Core\Debugger.Core.csproj", "{1D18D788-F7EE-4585-A23B-34DC8EC63CB8}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassDiagramAddin", "src\AddIns\DisplayBindings\ClassDiagram\ClassDiagramAddin\ClassDiagramAddin.csproj", "{5A1354DF-4989-4BB4-BC6B-D627C2E9FA13}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.AddIn", "src\AddIns\Debugger\Debugger.AddIn\Debugger.AddIn.csproj", "{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Diagrams", "src\AddIns\DisplayBindings\ClassDiagram\DiagramRouter\Diagrams.csproj", "{0991423A-DBF6-4C89-B365-A1DF1EB32E42}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Misc", "Misc", "{F3662720-9EA2-4591-BBC6-97361DCE50A9}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Data", "Data", "{C7F29FC2-1B03-4CDD-9E30-400F4765FF04}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpRefactoring.Tests", "src\AddIns\Misc\SharpRefactoring\Test\SharpRefactoring.Tests.csproj", "{A4AA51DE-A096-47EC-AA5D-D91457834ECF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpRefactoring", "src\AddIns\Misc\SharpRefactoring\Project\SharpRefactoring.csproj", "{3CA90546-3B4C-4663-9445-C4E9371750A7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SearchAndReplace", "src\AddIns\Misc\SearchAndReplace\Project\SearchAndReplace.csproj", "{9196DD8A-B4D4-4780-8742-C5762E547FC2}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Data.Addin", "src\AddIns\DisplayBindings\Data\ICSharpCode.Data.Addin\ICSharpCode.Data.Addin.csproj", "{A9F12710-24E4-46D4-832C-6ECB395B9EAD}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReflectorAddIn", "src\AddIns\Misc\ReflectorAddIn\ReflectorAddIn\Project\ReflectorAddIn.csproj", "{8AA421C8-D7AF-4957-9F43-5135328ACB24}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Data.Core", "src\AddIns\DisplayBindings\Data\ICSharpCode.Data.Core\ICSharpCode.Data.Core.csproj", "{B7823AE9-4B43-4859-8796-2EBDC116FBB8}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartPage", "src\AddIns\Misc\StartPage\Project\StartPage.csproj", "{7D5C266F-D6FF-4D14-B315-0C0FC6C4EF51}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Data.Core.UI", "src\AddIns\DisplayBindings\Data\ICSharpCode.Data.Core.UI\ICSharpCode.Data.Core.UI.csproj", "{BAD94D6E-4159-4CB6-B991-486F412D9BB6}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddInManager", "src\AddIns\Misc\AddInManager\Project\AddInManager.csproj", "{F93E52FD-DA66-4CE5-A0CB-BCD902811122}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Data.EDMDesigner.Core", "src\AddIns\DisplayBindings\Data\ICSharpCode.Data.EDMDesigner.Core\ICSharpCode.Data.EDMDesigner.Core.csproj", "{5C70D6AB-0A33-43F9-B8B5-54558C35BBB1}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddinScout", "src\AddIns\Misc\AddinScout\Project\AddinScout.csproj", "{4B8F0F98-8BE1-402B-AA8B-C8D548577B38}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Data.EDMDesigner.Core.UI", "src\AddIns\DisplayBindings\Data\ICSharpCode.Data.EDMDesigner.Core.UI\ICSharpCode.Data.EDMDesigner.Core.UI.csproj", "{EEF5E054-4192-4A57-8FBF-E860D808A51D}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FiletypeRegisterer", "src\AddIns\Misc\FiletypeRegisterer\Project\FiletypeRegisterer.csproj", "{D022A6CE-7438-41E8-AC64-F2DE18EC54C6}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Data.SQLServer", "src\AddIns\DisplayBindings\Data\ICSharpCode.Data.SQLServer\ICSharpCode.Data.SQLServer.csproj", "{AFE34868-AFA1-4E1C-9450-47AB4BE329D5}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlHelp2", "src\AddIns\Misc\HtmlHelp2\Project\HtmlHelp2.csproj", "{918487B7-2153-4618-BBB3-344DBDDF2A2A}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Misc", "Misc", "{F3662720-9EA2-4591-BBC6-97361DCE50A9}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "HtmlHelp2JScriptGlobals", "src\AddIns\Misc\HtmlHelp2\JScriptGlobals\HtmlHelp2JScriptGlobals.vbproj", "{E54A5AD2-418D-4A85-BA5E-CD803DE38715}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UsageDataCollector", "UsageDataCollector", "{DEFC8584-BEC3-4921-BD0F-40482E450B7B}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UsageDataCollector.AddIn", "src\AddIns\Misc\UsageDataCollector\UsageDataCollector.AddIn\UsageDataCollector.AddIn.csproj", "{0008FCE9-9EB4-4E2E-979B-553278E5BBA6}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PInvokeAddIn", "src\AddIns\Misc\PInvokeAddIn\Project\PInvokeAddIn.csproj", "{5EEB99CF-EA2B-4733-80A6-CE9192D68170}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UsageDataCollector", "src\AddIns\Misc\UsageDataCollector\UsageDataCollector\UsageDataCollector.csproj", "{6B1CFE35-DA17-4DEB-9C6E-227E5E251DA0}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RegExpTk", "src\AddIns\Misc\RegExpTk\Project\RegExpTk.csproj", "{64A3E5E6-90BF-47F6-94DF-68C94B62C817}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SearchAndReplace.Tests", "src\AddIns\Misc\SearchAndReplace\Test\SearchAndReplace.Tests.csproj", "{A569DCC1-C608-45FD-B770-4F79335EF154}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceToolkit", "src\AddIns\Misc\ResourceToolkit\Project\ResourceToolkit.csproj", "{461606BD-E824-4D0A-8CBA-01810B1F5E02}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceToolkit.Tests", "src\AddIns\Misc\ResourceToolkit\Test\ResourceToolkit.Tests.csproj", "{DD9AE6A5-2B9D-443A-BC71-38BE578C36BD}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
@ -345,216 +345,226 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubversionAddIn", "src\AddI @@ -345,216 +345,226 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubversionAddIn", "src\AddI
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceToolkit.Tests", "src\AddIns\Misc\ResourceToolkit\Test\ResourceToolkit.Tests.csproj", "{DD9AE6A5-2B9D-443A-BC71-38BE578C36BD}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceToolkit", "src\AddIns\Misc\ResourceToolkit\Project\ResourceToolkit.csproj", "{461606BD-E824-4D0A-8CBA-01810B1F5E02}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SearchAndReplace.Tests", "src\AddIns\Misc\SearchAndReplace\Test\SearchAndReplace.Tests.csproj", "{A569DCC1-C608-45FD-B770-4F79335EF154}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RegExpTk", "src\AddIns\Misc\RegExpTk\Project\RegExpTk.csproj", "{64A3E5E6-90BF-47F6-94DF-68C94B62C817}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UsageDataCollector", "UsageDataCollector", "{DEFC8584-BEC3-4921-BD0F-40482E450B7B}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UsageDataCollector", "src\AddIns\Misc\UsageDataCollector\UsageDataCollector\UsageDataCollector.csproj", "{6B1CFE35-DA17-4DEB-9C6E-227E5E251DA0}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PInvokeAddIn", "src\AddIns\Misc\PInvokeAddIn\Project\PInvokeAddIn.csproj", "{5EEB99CF-EA2B-4733-80A6-CE9192D68170}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UsageDataCollector.AddIn", "src\AddIns\Misc\UsageDataCollector\UsageDataCollector.AddIn\UsageDataCollector.AddIn.csproj", "{0008FCE9-9EB4-4E2E-979B-553278E5BBA6}"
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "HtmlHelp2JScriptGlobals", "src\AddIns\Misc\HtmlHelp2\JScriptGlobals\HtmlHelp2JScriptGlobals.vbproj", "{E54A5AD2-418D-4A85-BA5E-CD803DE38715}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Display Bindings", "Display Bindings", "{11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Data", "Data", "{C7F29FC2-1B03-4CDD-9E30-400F4765FF04}"
ProjectSection(SolutionItems) = postProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlHelp2", "src\AddIns\Misc\HtmlHelp2\Project\HtmlHelp2.csproj", "{918487B7-2153-4618-BBB3-344DBDDF2A2A}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Data.SQLServer", "src\AddIns\DisplayBindings\Data\ICSharpCode.Data.SQLServer\ICSharpCode.Data.SQLServer.csproj", "{AFE34868-AFA1-4E1C-9450-47AB4BE329D5}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FiletypeRegisterer", "src\AddIns\Misc\FiletypeRegisterer\Project\FiletypeRegisterer.csproj", "{D022A6CE-7438-41E8-AC64-F2DE18EC54C6}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Data.EDMDesigner.Core.UI", "src\AddIns\DisplayBindings\Data\ICSharpCode.Data.EDMDesigner.Core.UI\ICSharpCode.Data.EDMDesigner.Core.UI.csproj", "{EEF5E054-4192-4A57-8FBF-E860D808A51D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddinScout", "src\AddIns\Misc\AddinScout\Project\AddinScout.csproj", "{4B8F0F98-8BE1-402B-AA8B-C8D548577B38}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Data.EDMDesigner.Core", "src\AddIns\DisplayBindings\Data\ICSharpCode.Data.EDMDesigner.Core\ICSharpCode.Data.EDMDesigner.Core.csproj", "{5C70D6AB-0A33-43F9-B8B5-54558C35BBB1}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddInManager", "src\AddIns\Misc\AddInManager\Project\AddInManager.csproj", "{F93E52FD-DA66-4CE5-A0CB-BCD902811122}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Data.Core.UI", "src\AddIns\DisplayBindings\Data\ICSharpCode.Data.Core.UI\ICSharpCode.Data.Core.UI.csproj", "{BAD94D6E-4159-4CB6-B991-486F412D9BB6}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartPage", "src\AddIns\Misc\StartPage\Project\StartPage.csproj", "{7D5C266F-D6FF-4D14-B315-0C0FC6C4EF51}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Data.Core", "src\AddIns\DisplayBindings\Data\ICSharpCode.Data.Core\ICSharpCode.Data.Core.csproj", "{B7823AE9-4B43-4859-8796-2EBDC116FBB8}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReflectorAddIn", "src\AddIns\Misc\ReflectorAddIn\ReflectorAddIn\Project\ReflectorAddIn.csproj", "{8AA421C8-D7AF-4957-9F43-5135328ACB24}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Data.Addin", "src\AddIns\DisplayBindings\Data\ICSharpCode.Data.Addin\ICSharpCode.Data.Addin.csproj", "{A9F12710-24E4-46D4-832C-6ECB395B9EAD}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SearchAndReplace", "src\AddIns\Misc\SearchAndReplace\Project\SearchAndReplace.csproj", "{9196DD8A-B4D4-4780-8742-C5762E547FC2}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ClassDiagram", "ClassDiagram", "{BFA3BF26-33BD-4A65-B84D-C7F30D131668}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpRefactoring", "src\AddIns\Misc\SharpRefactoring\Project\SharpRefactoring.csproj", "{3CA90546-3B4C-4663-9445-C4E9371750A7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpRefactoring.Tests", "src\AddIns\Misc\SharpRefactoring\Test\SharpRefactoring.Tests.csproj", "{A4AA51DE-A096-47EC-AA5D-D91457834ECF}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debugger", "Debugger", "{CDE0C5A4-2096-48B5-BEA3-74DBA0F0E1EF}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Diagrams", "src\AddIns\DisplayBindings\ClassDiagram\DiagramRouter\Diagrams.csproj", "{0991423A-DBF6-4C89-B365-A1DF1EB32E42}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.AddIn", "src\AddIns\Debugger\Debugger.AddIn\Debugger.AddIn.csproj", "{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassDiagramAddin", "src\AddIns\DisplayBindings\ClassDiagram\ClassDiagramAddin\ClassDiagramAddin.csproj", "{5A1354DF-4989-4BB4-BC6B-D627C2E9FA13}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.Core", "src\AddIns\Debugger\Debugger.Core\Debugger.Core.csproj", "{1D18D788-F7EE-4585-A23B-34DC8EC63CB8}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassCanvas", "src\AddIns\DisplayBindings\ClassDiagram\ClassCanvas\ClassCanvas.csproj", "{08F772A1-F0BE-433E-8B37-F6522953DB05}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.Tests", "src\AddIns\Debugger\Debugger.Tests\Debugger.Tests.csproj", "{A4C858C8-51B6-4265-A695-A20FCEBA1D19}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsDesigner", "src\AddIns\DisplayBindings\FormsDesigner\Project\FormsDesigner.csproj", "{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Language Bindings", "Language Bindings", "{E0646C25-36F2-4524-969F-FA621353AB94}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FSharpBinding", "src\AddIns\BackendBindings\FSharpBinding\FSharpBinding.csproj", "{E954F3CB-A446-492F-A664-2B376EBC86E8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixBinding.Tests", "src\AddIns\BackendBindings\WixBinding\Test\WixBinding.Tests.csproj", "{388E7B64-0393-4EB4-A3E3-5C474F141853}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XmlEditor", "src\AddIns\DisplayBindings\XmlEditor\Project\XmlEditor.csproj", "{DCA2703D-250A-463E-A68A-07ED105AE6BD}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlBinding.Tests", "src\AddIns\BackendBindings\XamlBinding\XamlBinding.Tests\XamlBinding.Tests.csproj", "{F390DA70-1FE1-4715-81A0-389AB010C130}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvalonEdit.AddIn", "src\AddIns\DisplayBindings\AvalonEdit.AddIn\AvalonEdit.AddIn.csproj", "{0162E499-42D0-409B-AA25-EED21F75336B}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlBinding", "src\AddIns\BackendBindings\XamlBinding\XamlBinding\XamlBinding.csproj", "{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceEditor", "src\AddIns\DisplayBindings\ResourceEditor\Project\ResourceEditor.csproj", "{CBC6C247-747B-4908-B09A-4D2E0F640B6B}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VBNetBinding", "src\AddIns\BackendBindings\VBNetBinding\Project\VBNetBinding.csproj", "{BF38FB72-B380-4196-AF8C-95749D726C61}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SettingsEditor", "src\AddIns\DisplayBindings\SettingsEditor\Project\SettingsEditor.csproj", "{85226AFB-CE71-4851-9A75-7EEC663A8E8A}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpBinding", "src\AddIns\BackendBindings\CSharpBinding\Project\CSharpBinding.csproj", "{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HexEditor", "src\AddIns\DisplayBindings\HexEditor\Project\HexEditor.csproj", "{E618A9CD-A39F-4925-A538-E8A3FEF24E54}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixBinding", "src\AddIns\BackendBindings\WixBinding\Project\WixBinding.csproj", "{E1B288A2-08EE-4318-8BBB-8AB72C69E33E}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IconEditor", "IconEditor", "{0773ED53-08E2-4495-A3BE-CA0B5D413C15}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ILAsmBinding", "src\AddIns\BackendBindings\ILAsmBinding\Project\ILAsmBinding.csproj", "{6E59AF58-F635-459A-9A35-C9AC41C00339}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Python", "Python", "{CA76F702-5B4E-4918-B8D8-7FF8382434FF}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IconEditor", "src\AddIns\DisplayBindings\IconEditor\IconEditor\IconEditor.csproj", "{DC1CCE11-CB91-40FA-9C47-4D9EB5D67BFD}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PythonBinding", "src\AddIns\BackendBindings\Python\PythonBinding\Project\PythonBinding.csproj", "{8D732610-8FC6-43BA-94C9-7126FD7FE361}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IconEditorAddIn", "src\AddIns\DisplayBindings\IconEditor\IconEditorAddIn\IconEditorAddIn.csproj", "{DFB936AD-90EE-4B4F-941E-4F4A636F0D92}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Python.Build.Tasks", "src\AddIns\BackendBindings\Python\Python.Build.Tasks\Project\Python.Build.Tasks.csproj", "{D332F2D1-2CF1-43B7-903C-844BD5211A7E}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XmlEditor.Tests", "src\AddIns\DisplayBindings\XmlEditor\Test\XmlEditor.Tests.csproj", "{FC0FE702-A87D-4D70-A9B6-1ECCD611125F}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Python.Build.Tasks.Tests", "src\AddIns\BackendBindings\Python\Python.Build.Tasks\Test\Python.Build.Tasks.Tests.csproj", "{833904AB-3CD4-4071-9B48-5770E44685AA}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WpfDesign", "WpfDesign", "{6022AC51-B658-4C54-97EF-79187AC65B47}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign", "src\AddIns\DisplayBindings\WpfDesign\WpfDesign\Project\WpfDesign.csproj", "{66A378A1-E9F4-4AD5-8946-D0EC06C2902F}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PythonBinding.Tests", "src\AddIns\BackendBindings\Python\PythonBinding\Test\PythonBinding.Tests.csproj", "{23B517C9-1ECC-4419-A13F-0B7136D085CB}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.AddIn", "src\AddIns\DisplayBindings\WpfDesign\WpfDesign.AddIn\WpfDesign.AddIn.csproj", "{9A9D6FD4-6A2E-455D-ACC3-DDA775FE9865}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Boo", "Boo", "{97B3B514-AB0E-4FE1-89DE-8A945F5112AE}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryToBooConverter.Tests", "src\AddIns\BackendBindings\Boo\NRefactoryToBooConverter\Test\NRefactoryToBooConverter.Tests.csproj", "{C9DE556D-325C-4544-B29F-16A9EB7C9830}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.Designer", "src\AddIns\DisplayBindings\WpfDesign\WpfDesign.Designer\Project\WpfDesign.Designer.csproj", "{78CC29AC-CC79-4355-B1F2-97936DF198AC}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryToBooConverter", "src\AddIns\BackendBindings\Boo\NRefactoryToBooConverter\Project\NRefactoryToBooConverter.csproj", "{DBCF20A1-BA13-4582-BFA9-74DE4D987B73}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.Tests", "src\AddIns\DisplayBindings\WpfDesign\WpfDesign.Designer\Tests\WpfDesign.Tests.csproj", "{943DBBB3-E84E-4CF4-917C-C05AFA8743C1}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding", "src\AddIns\BackendBindings\Boo\BooBinding\Project\BooBinding.csproj", "{4AC2D5F1-F671-480C-A075-6BF62B3721B2}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WpfDesign.XamlDom", "src\AddIns\DisplayBindings\WpfDesign\WpfDesign.XamlDom\Project\WpfDesign.XamlDom.csproj", "{88DA149F-21B2-48AB-82C4-28FB6BDFD783}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding.Tests", "src\AddIns\BackendBindings\Boo\BooBinding\Test\BooBinding.Tests.csproj", "{6FA16499-896F-4C02-BB43-1AF5C6C7C713}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ComponentInspector", "ComponentInspector", "{D599885D-E161-4CCE-A66E-7A40C8C4F4CC}"
ProjectSection(SolutionItems) = postProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VBNetBinding.Tests", "src\AddIns\BackendBindings\VBNetBinding\Test\VBNetBinding.Tests.csproj", "{50A89267-A28B-4DF3-8E62-912E005143B8}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector", "src\AddIns\Misc\ComponentInspector\ComponentInspector\ComponentInspector.csproj", "{000E4F64-5D0D-4EB1-B0BF-1A62ADBC6EAD}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpBinding.Tests", "src\AddIns\BackendBindings\CSharpBinding\Tests\CSharpBinding.Tests.csproj", "{52006F3F-3156-45DE-89D8-C4813694FBA4}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector.Core", "src\AddIns\Misc\ComponentInspector\ComponentInspector.Core\ComponentInspector.Core.csproj", "{E6F4983F-DE41-4AEC-88E7-1FA9AFB4E6FF}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CppBinding", "src\AddIns\BackendBindings\CppBinding\CppBinding\CppBinding.csproj", "{70966F84-74C9-4067-A379-0C674A929233}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector.AddIn", "src\AddIns\Misc\ComponentInspector\ComponentInspector.AddIn\ComponentInspector.AddIn.csproj", "{869951D5-A0D6-4DC6-9F1D-E6B9A12AC446}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RubyBinding", "src\AddIns\BackendBindings\Ruby\RubyBinding\Project\RubyBinding.csproj", "{C896FFFF-5B6C-4B0E-B6DF-049865F501B4}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analysis", "Analysis", "{F355E45F-F54F-4B42-8916-9A633A392789}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Profiler", "Profiler", "{C4035C32-026F-4158-AF15-113EA1EF1960}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage.Tests", "src\AddIns\Misc\CodeCoverage\Test\CodeCoverage.Tests.csproj", "{A5C0E8F8-9D04-46ED-91D6-1DEF1575313B}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Profiler.Tests", "src\AddIns\Misc\Profiler\Tests\Profiler.Tests\Profiler.Tests.csproj", "{068F9531-5D29-49E0-980E-59982A3A0469}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting", "src\AddIns\Misc\UnitTesting\UnitTesting.csproj", "{1F261725-6318-4434-A1B1-6C70CE4CD324}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
Project("{0E96FCFA-9DAC-4534-AC18-01A90C368873}") = "Hook", "src\AddIns\Misc\Profiler\Hook\Hook.vcxproj", "{68D5EE3B-0C35-4DF1-BD29-6606851A02C1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeAnalysis", "src\AddIns\Misc\CodeAnalysis\CodeAnalysis.csproj", "{3EAA45A9-735C-4AC7-A799-947B93EA449D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Profiler.X64Converter", "src\AddIns\Misc\Profiler\X64Converter\Profiler.X64Converter.csproj", "{FE88FE17-D9FB-4FCC-9A35-6BFFB6B26CC6}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage", "src\AddIns\Misc\CodeCoverage\Project\CodeCoverage.csproj", "{08CE9972-283B-44F4-82FA-966F7DFA6B7A}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Profiler.Controller", "src\AddIns\Misc\Profiler\Controller\Profiler.Controller.csproj", "{72FFB35A-C9E2-4A31-B4FA-E3E3E28DED5F}"
ProjectSection(ProjectDependencies) = postProject
{FE88FE17-D9FB-4FCC-9A35-6BFFB6B26CC6} = {FE88FE17-D9FB-4FCC-9A35-6BFFB6B26CC6}
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SourceAnalysis", "src\AddIns\Misc\SourceAnalysis\SourceAnalysis.csproj", "{CE498514-D12D-4B6E-AE0E-FEC29BD43748}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Profiler.Controls", "src\AddIns\Misc\Profiler\Frontend\Controls\Profiler.Controls.csproj", "{BDA49550-5ED1-4C6B-B648-657B2CACD8E0}"
ProjectSection(ProjectDependencies) = postProject
{FE88FE17-D9FB-4FCC-9A35-6BFFB6B26CC6} = {FE88FE17-D9FB-4FCC-9A35-6BFFB6B26CC6}
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting.Tests", "src\AddIns\Misc\UnitTesting\Test\UnitTesting.Tests.csproj", "{44A8DE09-CAB9-49D8-9CFC-5EB0A552F181}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Profiler.AddIn", "src\AddIns\Misc\Profiler\Frontend\AddIn\Profiler.AddIn.csproj", "{D294A12D-4B38-4F25-9AA6-3D4A6CE26E7B}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
{FE88FE17-D9FB-4FCC-9A35-6BFFB6B26CC6} = {FE88FE17-D9FB-4FCC-9A35-6BFFB6B26CC6}
{68D5EE3B-0C35-4DF1-BD29-6606851A02C1} = {68D5EE3B-0C35-4DF1-BD29-6606851A02C1}
EndProjectSection
EndProject
Project("{00000000-0000-0000-0000-000000000000}") = "Tools", "src\Tools\Tools.build", "{3DF4060F-5EE0-41CF-8096-F27355FD5511}"
@ -1001,125 +1011,151 @@ Global @@ -1001,125 +1011,151 @@ Global
{E954F3CB-A446-492F-A664-2B376EBC86E8}.Release|Win32.ActiveCfg = Release|Any CPU
{E954F3CB-A446-492F-A664-2B376EBC86E8}.Release|x86.Build.0 = Release|Any CPU
{E954F3CB-A446-492F-A664-2B376EBC86E8}.Release|x86.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}.Debug|Win32.Build.0 = Debug|Any CPU
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Debug|Win32.ActiveCfg = Debug|Any CPU
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Debug|x86.Build.0 = Debug|Any CPU
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Debug|x86.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
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Release|Win32.Build.0 = Release|Any CPU
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Release|Win32.ActiveCfg = Release|Any CPU
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Release|x86.Build.0 = Release|Any CPU
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Release|x86.ActiveCfg = Release|Any CPU
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Debug|Any CPU.Build.0 = Debug|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Debug|Any CPU.ActiveCfg = Debug|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Debug|Win32.Build.0 = Debug|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Debug|Win32.ActiveCfg = Debug|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Debug|x86.Build.0 = Debug|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Debug|x86.ActiveCfg = Debug|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Release|Any CPU.Build.0 = Release|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Release|Any CPU.ActiveCfg = Release|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Release|Win32.Build.0 = Release|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Release|Win32.ActiveCfg = Release|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Release|x86.Build.0 = Release|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Release|x86.ActiveCfg = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{1152B71B-3C05-4598-B20D-823B5D40559E} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{8035765F-D51F-4A0C-A746-2FD100E19419} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{2748AD25-9C63-4E12-877B-4DCE96FBED54} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{80318B5F-A25D-45AB-8A95-EF31D2370A4C} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{924EE450-603D-49C1-A8E5-4AFAA31CE6F3} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{7E4A7172-7FF5-48D0-B719-7CD959DD1AC9} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{4980B743-B32F-4aba-AABD-45E2CAD3568D} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{B5F54272-49F0-40DB-845A-8D837875D3BA} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{7DB80259-24D4-46C3-A024-53FF1987733D} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{E73BB233-D88B-44A7-A98F-D71EE158381D} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{2FF700C2-A38A-48BD-A637-8CAFD4FE6237} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{E5A0F4D8-37FD-4A30-BEB0-4409DC4E0865} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{4980B743-B32F-4aba-AABD-45E2CAD3568D} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{7E4A7172-7FF5-48D0-B719-7CD959DD1AC9} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{924EE450-603D-49C1-A8E5-4AFAA31CE6F3} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{80318B5F-A25D-45AB-8A95-EF31D2370A4C} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{2748AD25-9C63-4E12-877B-4DCE96FBED54} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{8035765F-D51F-4A0C-A746-2FD100E19419} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{1152B71B-3C05-4598-B20D-823B5D40559E} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{6222A3A1-83CE-47A3-A4E4-A018F82D44D8} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195} = {E5A0F4D8-37FD-4A30-BEB0-4409DC4E0865}
{B22522AA-B5BF-4A58-AC6D-D4B45805521F} = {E5A0F4D8-37FD-4A30-BEB0-4409DC4E0865}
{E5A0F4D8-37FD-4A30-BEB0-4409DC4E0865} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{2FF700C2-A38A-48BD-A637-8CAFD4FE6237} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{E73BB233-D88B-44A7-A98F-D71EE158381D} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{870115DD-960A-4406-A6B9-600BCDC36A03} = {E5A0F4D8-37FD-4A30-BEB0-4409DC4E0865}
{F355E45F-F54F-4B42-8916-9A633A392789} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
{D599885D-E161-4CCE-A66E-7A40C8C4F4CC} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
{11BF9245-88A3-4A0A-9A8A-EC9D98036B0F} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
{F3662720-9EA2-4591-BBC6-97361DCE50A9} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
{CDE0C5A4-2096-48B5-BEA3-74DBA0F0E1EF} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
{E0646C25-36F2-4524-969F-FA621353AB94} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
{B22522AA-B5BF-4A58-AC6D-D4B45805521F} = {E5A0F4D8-37FD-4A30-BEB0-4409DC4E0865}
{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195} = {E5A0F4D8-37FD-4A30-BEB0-4409DC4E0865}
{C4035C32-026F-4158-AF15-113EA1EF1960} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
{068F9531-5D29-49E0-980E-59982A3A0469} = {C4035C32-026F-4158-AF15-113EA1EF1960}
{68D5EE3B-0C35-4DF1-BD29-6606851A02C1} = {C4035C32-026F-4158-AF15-113EA1EF1960}
{FE88FE17-D9FB-4FCC-9A35-6BFFB6B26CC6} = {C4035C32-026F-4158-AF15-113EA1EF1960}
{72FFB35A-C9E2-4A31-B4FA-E3E3E28DED5F} = {C4035C32-026F-4158-AF15-113EA1EF1960}
{BDA49550-5ED1-4C6B-B648-657B2CACD8E0} = {C4035C32-026F-4158-AF15-113EA1EF1960}
{D294A12D-4B38-4F25-9AA6-3D4A6CE26E7B} = {C4035C32-026F-4158-AF15-113EA1EF1960}
{E954F3CB-A446-492F-A664-2B376EBC86E8} = {E0646C25-36F2-4524-969F-FA621353AB94}
{388E7B64-0393-4EB4-A3E3-5C474F141853} = {E0646C25-36F2-4524-969F-FA621353AB94}
{F390DA70-1FE1-4715-81A0-389AB010C130} = {E0646C25-36F2-4524-969F-FA621353AB94}
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8} = {E0646C25-36F2-4524-969F-FA621353AB94}
{BF38FB72-B380-4196-AF8C-95749D726C61} = {E0646C25-36F2-4524-969F-FA621353AB94}
{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A} = {E0646C25-36F2-4524-969F-FA621353AB94}
{E1B288A2-08EE-4318-8BBB-8AB72C69E33E} = {E0646C25-36F2-4524-969F-FA621353AB94}
{6E59AF58-F635-459A-9A35-C9AC41C00339} = {E0646C25-36F2-4524-969F-FA621353AB94}
{CA76F702-5B4E-4918-B8D8-7FF8382434FF} = {E0646C25-36F2-4524-969F-FA621353AB94}
{97B3B514-AB0E-4FE1-89DE-8A945F5112AE} = {E0646C25-36F2-4524-969F-FA621353AB94}
{50A89267-A28B-4DF3-8E62-912E005143B8} = {E0646C25-36F2-4524-969F-FA621353AB94}
{52006F3F-3156-45DE-89D8-C4813694FBA4} = {E0646C25-36F2-4524-969F-FA621353AB94}
{70966F84-74C9-4067-A379-0C674A929233} = {E0646C25-36F2-4524-969F-FA621353AB94}
{C896FFFF-5B6C-4B0E-B6DF-049865F501B4} = {E0646C25-36F2-4524-969F-FA621353AB94}
{C9DE556D-325C-4544-B29F-16A9EB7C9830} = {97B3B514-AB0E-4FE1-89DE-8A945F5112AE}
{DBCF20A1-BA13-4582-BFA9-74DE4D987B73} = {97B3B514-AB0E-4FE1-89DE-8A945F5112AE}
{4AC2D5F1-F671-480C-A075-6BF62B3721B2} = {97B3B514-AB0E-4FE1-89DE-8A945F5112AE}
{6FA16499-896F-4C02-BB43-1AF5C6C7C713} = {97B3B514-AB0E-4FE1-89DE-8A945F5112AE}
{8D732610-8FC6-43BA-94C9-7126FD7FE361} = {CA76F702-5B4E-4918-B8D8-7FF8382434FF}
{D332F2D1-2CF1-43B7-903C-844BD5211A7E} = {CA76F702-5B4E-4918-B8D8-7FF8382434FF}
{833904AB-3CD4-4071-9B48-5770E44685AA} = {CA76F702-5B4E-4918-B8D8-7FF8382434FF}
{23B517C9-1ECC-4419-A13F-0B7136D085CB} = {CA76F702-5B4E-4918-B8D8-7FF8382434FF}
{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C} = {CDE0C5A4-2096-48B5-BEA3-74DBA0F0E1EF}
{1D18D788-F7EE-4585-A23B-34DC8EC63CB8} = {CDE0C5A4-2096-48B5-BEA3-74DBA0F0E1EF}
{A4C858C8-51B6-4265-A695-A20FCEBA1D19} = {CDE0C5A4-2096-48B5-BEA3-74DBA0F0E1EF}
{DEFC8584-BEC3-4921-BD0F-40482E450B7B} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{A569DCC1-C608-45FD-B770-4F79335EF154} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{DD9AE6A5-2B9D-443A-BC71-38BE578C36BD} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{17F4D7E0-6933-4C2E-8714-FD7E98D625D5} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{461606BD-E824-4D0A-8CBA-01810B1F5E02} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{64A3E5E6-90BF-47F6-94DF-68C94B62C817} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{5EEB99CF-EA2B-4733-80A6-CE9192D68170} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{E54A5AD2-418D-4A85-BA5E-CD803DE38715} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{918487B7-2153-4618-BBB3-344DBDDF2A2A} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{D022A6CE-7438-41E8-AC64-F2DE18EC54C6} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{4B8F0F98-8BE1-402B-AA8B-C8D548577B38} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{F93E52FD-DA66-4CE5-A0CB-BCD902811122} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{7D5C266F-D6FF-4D14-B315-0C0FC6C4EF51} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{8AA421C8-D7AF-4957-9F43-5135328ACB24} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{9196DD8A-B4D4-4780-8742-C5762E547FC2} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{3CA90546-3B4C-4663-9445-C4E9371750A7} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{A4AA51DE-A096-47EC-AA5D-D91457834ECF} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{0008FCE9-9EB4-4E2E-979B-553278E5BBA6} = {DEFC8584-BEC3-4921-BD0F-40482E450B7B}
{6B1CFE35-DA17-4DEB-9C6E-227E5E251DA0} = {DEFC8584-BEC3-4921-BD0F-40482E450B7B}
{6022AC51-B658-4C54-97EF-79187AC65B47} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{FC0FE702-A87D-4D70-A9B6-1ECCD611125F} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{0773ED53-08E2-4495-A3BE-CA0B5D413C15} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{E618A9CD-A39F-4925-A538-E8A3FEF24E54} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{85226AFB-CE71-4851-9A75-7EEC663A8E8A} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{CBC6C247-747B-4908-B09A-4D2E0F640B6B} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{0162E499-42D0-409B-AA25-EED21F75336B} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{DCA2703D-250A-463E-A68A-07ED105AE6BD} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{BFA3BF26-33BD-4A65-B84D-C7F30D131668} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{E0646C25-36F2-4524-969F-FA621353AB94} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
{CDE0C5A4-2096-48B5-BEA3-74DBA0F0E1EF} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
{F3662720-9EA2-4591-BBC6-97361DCE50A9} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
{11BF9245-88A3-4A0A-9A8A-EC9D98036B0F} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
{D599885D-E161-4CCE-A66E-7A40C8C4F4CC} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
{F355E45F-F54F-4B42-8916-9A633A392789} = {39327899-ED91-4F7F-988C-4FE4E17C014D}
{A5C0E8F8-9D04-46ED-91D6-1DEF1575313B} = {F355E45F-F54F-4B42-8916-9A633A392789}
{1F261725-6318-4434-A1B1-6C70CE4CD324} = {F355E45F-F54F-4B42-8916-9A633A392789}
{3EAA45A9-735C-4AC7-A799-947B93EA449D} = {F355E45F-F54F-4B42-8916-9A633A392789}
{08CE9972-283B-44F4-82FA-966F7DFA6B7A} = {F355E45F-F54F-4B42-8916-9A633A392789}
{CE498514-D12D-4B6E-AE0E-FEC29BD43748} = {F355E45F-F54F-4B42-8916-9A633A392789}
{44A8DE09-CAB9-49D8-9CFC-5EB0A552F181} = {F355E45F-F54F-4B42-8916-9A633A392789}
{000E4F64-5D0D-4EB1-B0BF-1A62ADBC6EAD} = {D599885D-E161-4CCE-A66E-7A40C8C4F4CC}
{E6F4983F-DE41-4AEC-88E7-1FA9AFB4E6FF} = {D599885D-E161-4CCE-A66E-7A40C8C4F4CC}
{869951D5-A0D6-4DC6-9F1D-E6B9A12AC446} = {D599885D-E161-4CCE-A66E-7A40C8C4F4CC}
{C7F29FC2-1B03-4CDD-9E30-400F4765FF04} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{A9F12710-24E4-46D4-832C-6ECB395B9EAD} = {C7F29FC2-1B03-4CDD-9E30-400F4765FF04}
{B7823AE9-4B43-4859-8796-2EBDC116FBB8} = {C7F29FC2-1B03-4CDD-9E30-400F4765FF04}
{BAD94D6E-4159-4CB6-B991-486F412D9BB6} = {C7F29FC2-1B03-4CDD-9E30-400F4765FF04}
{5C70D6AB-0A33-43F9-B8B5-54558C35BBB1} = {C7F29FC2-1B03-4CDD-9E30-400F4765FF04}
{EEF5E054-4192-4A57-8FBF-E860D808A51D} = {C7F29FC2-1B03-4CDD-9E30-400F4765FF04}
{AFE34868-AFA1-4E1C-9450-47AB4BE329D5} = {C7F29FC2-1B03-4CDD-9E30-400F4765FF04}
{08F772A1-F0BE-433E-8B37-F6522953DB05} = {BFA3BF26-33BD-4A65-B84D-C7F30D131668}
{5A1354DF-4989-4BB4-BC6B-D627C2E9FA13} = {BFA3BF26-33BD-4A65-B84D-C7F30D131668}
{0991423A-DBF6-4C89-B365-A1DF1EB32E42} = {BFA3BF26-33BD-4A65-B84D-C7F30D131668}
{DFB936AD-90EE-4B4F-941E-4F4A636F0D92} = {0773ED53-08E2-4495-A3BE-CA0B5D413C15}
{DC1CCE11-CB91-40FA-9C47-4D9EB5D67BFD} = {0773ED53-08E2-4495-A3BE-CA0B5D413C15}
{88DA149F-21B2-48AB-82C4-28FB6BDFD783} = {6022AC51-B658-4C54-97EF-79187AC65B47}
{943DBBB3-E84E-4CF4-917C-C05AFA8743C1} = {6022AC51-B658-4C54-97EF-79187AC65B47}
{78CC29AC-CC79-4355-B1F2-97936DF198AC} = {6022AC51-B658-4C54-97EF-79187AC65B47}
{9A9D6FD4-6A2E-455D-ACC3-DDA775FE9865} = {6022AC51-B658-4C54-97EF-79187AC65B47}
{BFA3BF26-33BD-4A65-B84D-C7F30D131668} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{DCA2703D-250A-463E-A68A-07ED105AE6BD} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{0162E499-42D0-409B-AA25-EED21F75336B} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{CBC6C247-747B-4908-B09A-4D2E0F640B6B} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{85226AFB-CE71-4851-9A75-7EEC663A8E8A} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{E618A9CD-A39F-4925-A538-E8A3FEF24E54} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{0773ED53-08E2-4495-A3BE-CA0B5D413C15} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{FC0FE702-A87D-4D70-A9B6-1ECCD611125F} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{6022AC51-B658-4C54-97EF-79187AC65B47} = {11BF9245-88A3-4A0A-9A8A-EC9D98036B0F}
{66A378A1-E9F4-4AD5-8946-D0EC06C2902F} = {6022AC51-B658-4C54-97EF-79187AC65B47}
{869951D5-A0D6-4DC6-9F1D-E6B9A12AC446} = {D599885D-E161-4CCE-A66E-7A40C8C4F4CC}
{E6F4983F-DE41-4AEC-88E7-1FA9AFB4E6FF} = {D599885D-E161-4CCE-A66E-7A40C8C4F4CC}
{000E4F64-5D0D-4EB1-B0BF-1A62ADBC6EAD} = {D599885D-E161-4CCE-A66E-7A40C8C4F4CC}
{44A8DE09-CAB9-49D8-9CFC-5EB0A552F181} = {F355E45F-F54F-4B42-8916-9A633A392789}
{CE498514-D12D-4B6E-AE0E-FEC29BD43748} = {F355E45F-F54F-4B42-8916-9A633A392789}
{08CE9972-283B-44F4-82FA-966F7DFA6B7A} = {F355E45F-F54F-4B42-8916-9A633A392789}
{3EAA45A9-735C-4AC7-A799-947B93EA449D} = {F355E45F-F54F-4B42-8916-9A633A392789}
{1F261725-6318-4434-A1B1-6C70CE4CD324} = {F355E45F-F54F-4B42-8916-9A633A392789}
{A5C0E8F8-9D04-46ED-91D6-1DEF1575313B} = {F355E45F-F54F-4B42-8916-9A633A392789}
{9A9D6FD4-6A2E-455D-ACC3-DDA775FE9865} = {6022AC51-B658-4C54-97EF-79187AC65B47}
{78CC29AC-CC79-4355-B1F2-97936DF198AC} = {6022AC51-B658-4C54-97EF-79187AC65B47}
{943DBBB3-E84E-4CF4-917C-C05AFA8743C1} = {6022AC51-B658-4C54-97EF-79187AC65B47}
{88DA149F-21B2-48AB-82C4-28FB6BDFD783} = {6022AC51-B658-4C54-97EF-79187AC65B47}
{DC1CCE11-CB91-40FA-9C47-4D9EB5D67BFD} = {0773ED53-08E2-4495-A3BE-CA0B5D413C15}
{DFB936AD-90EE-4B4F-941E-4F4A636F0D92} = {0773ED53-08E2-4495-A3BE-CA0B5D413C15}
{0991423A-DBF6-4C89-B365-A1DF1EB32E42} = {BFA3BF26-33BD-4A65-B84D-C7F30D131668}
{5A1354DF-4989-4BB4-BC6B-D627C2E9FA13} = {BFA3BF26-33BD-4A65-B84D-C7F30D131668}
{08F772A1-F0BE-433E-8B37-F6522953DB05} = {BFA3BF26-33BD-4A65-B84D-C7F30D131668}
{AFE34868-AFA1-4E1C-9450-47AB4BE329D5} = {C7F29FC2-1B03-4CDD-9E30-400F4765FF04}
{EEF5E054-4192-4A57-8FBF-E860D808A51D} = {C7F29FC2-1B03-4CDD-9E30-400F4765FF04}
{5C70D6AB-0A33-43F9-B8B5-54558C35BBB1} = {C7F29FC2-1B03-4CDD-9E30-400F4765FF04}
{BAD94D6E-4159-4CB6-B991-486F412D9BB6} = {C7F29FC2-1B03-4CDD-9E30-400F4765FF04}
{B7823AE9-4B43-4859-8796-2EBDC116FBB8} = {C7F29FC2-1B03-4CDD-9E30-400F4765FF04}
{A9F12710-24E4-46D4-832C-6ECB395B9EAD} = {C7F29FC2-1B03-4CDD-9E30-400F4765FF04}
{A4AA51DE-A096-47EC-AA5D-D91457834ECF} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{3CA90546-3B4C-4663-9445-C4E9371750A7} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{9196DD8A-B4D4-4780-8742-C5762E547FC2} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{8AA421C8-D7AF-4957-9F43-5135328ACB24} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{7D5C266F-D6FF-4D14-B315-0C0FC6C4EF51} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{F93E52FD-DA66-4CE5-A0CB-BCD902811122} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{4B8F0F98-8BE1-402B-AA8B-C8D548577B38} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{D022A6CE-7438-41E8-AC64-F2DE18EC54C6} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{918487B7-2153-4618-BBB3-344DBDDF2A2A} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{E54A5AD2-418D-4A85-BA5E-CD803DE38715} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{5EEB99CF-EA2B-4733-80A6-CE9192D68170} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{64A3E5E6-90BF-47F6-94DF-68C94B62C817} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{461606BD-E824-4D0A-8CBA-01810B1F5E02} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{17F4D7E0-6933-4C2E-8714-FD7E98D625D5} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{DD9AE6A5-2B9D-443A-BC71-38BE578C36BD} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{A569DCC1-C608-45FD-B770-4F79335EF154} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{DEFC8584-BEC3-4921-BD0F-40482E450B7B} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{6B1CFE35-DA17-4DEB-9C6E-227E5E251DA0} = {DEFC8584-BEC3-4921-BD0F-40482E450B7B}
{0008FCE9-9EB4-4E2E-979B-553278E5BBA6} = {DEFC8584-BEC3-4921-BD0F-40482E450B7B}
{A4C858C8-51B6-4265-A695-A20FCEBA1D19} = {CDE0C5A4-2096-48B5-BEA3-74DBA0F0E1EF}
{1D18D788-F7EE-4585-A23B-34DC8EC63CB8} = {CDE0C5A4-2096-48B5-BEA3-74DBA0F0E1EF}
{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C} = {CDE0C5A4-2096-48B5-BEA3-74DBA0F0E1EF}
{C896FFFF-5B6C-4B0E-B6DF-049865F501B4} = {E0646C25-36F2-4524-969F-FA621353AB94}
{70966F84-74C9-4067-A379-0C674A929233} = {E0646C25-36F2-4524-969F-FA621353AB94}
{52006F3F-3156-45DE-89D8-C4813694FBA4} = {E0646C25-36F2-4524-969F-FA621353AB94}
{50A89267-A28B-4DF3-8E62-912E005143B8} = {E0646C25-36F2-4524-969F-FA621353AB94}
{97B3B514-AB0E-4FE1-89DE-8A945F5112AE} = {E0646C25-36F2-4524-969F-FA621353AB94}
{CA76F702-5B4E-4918-B8D8-7FF8382434FF} = {E0646C25-36F2-4524-969F-FA621353AB94}
{6E59AF58-F635-459A-9A35-C9AC41C00339} = {E0646C25-36F2-4524-969F-FA621353AB94}
{E1B288A2-08EE-4318-8BBB-8AB72C69E33E} = {E0646C25-36F2-4524-969F-FA621353AB94}
{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A} = {E0646C25-36F2-4524-969F-FA621353AB94}
{BF38FB72-B380-4196-AF8C-95749D726C61} = {E0646C25-36F2-4524-969F-FA621353AB94}
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8} = {E0646C25-36F2-4524-969F-FA621353AB94}
{F390DA70-1FE1-4715-81A0-389AB010C130} = {E0646C25-36F2-4524-969F-FA621353AB94}
{388E7B64-0393-4EB4-A3E3-5C474F141853} = {E0646C25-36F2-4524-969F-FA621353AB94}
{E954F3CB-A446-492F-A664-2B376EBC86E8} = {E0646C25-36F2-4524-969F-FA621353AB94}
{23B517C9-1ECC-4419-A13F-0B7136D085CB} = {CA76F702-5B4E-4918-B8D8-7FF8382434FF}
{833904AB-3CD4-4071-9B48-5770E44685AA} = {CA76F702-5B4E-4918-B8D8-7FF8382434FF}
{D332F2D1-2CF1-43B7-903C-844BD5211A7E} = {CA76F702-5B4E-4918-B8D8-7FF8382434FF}
{8D732610-8FC6-43BA-94C9-7126FD7FE361} = {CA76F702-5B4E-4918-B8D8-7FF8382434FF}
{6FA16499-896F-4C02-BB43-1AF5C6C7C713} = {97B3B514-AB0E-4FE1-89DE-8A945F5112AE}
{4AC2D5F1-F671-480C-A075-6BF62B3721B2} = {97B3B514-AB0E-4FE1-89DE-8A945F5112AE}
{DBCF20A1-BA13-4582-BFA9-74DE4D987B73} = {97B3B514-AB0E-4FE1-89DE-8A945F5112AE}
{C9DE556D-325C-4544-B29F-16A9EB7C9830} = {97B3B514-AB0E-4FE1-89DE-8A945F5112AE}
{D294A12D-4B38-4F25-9AA6-3D4A6CE26E7B} = {C4035C32-026F-4158-AF15-113EA1EF1960}
{BDA49550-5ED1-4C6B-B648-657B2CACD8E0} = {C4035C32-026F-4158-AF15-113EA1EF1960}
{72FFB35A-C9E2-4A31-B4FA-E3E3E28DED5F} = {C4035C32-026F-4158-AF15-113EA1EF1960}
{FE88FE17-D9FB-4FCC-9A35-6BFFB6B26CC6} = {C4035C32-026F-4158-AF15-113EA1EF1960}
{68D5EE3B-0C35-4DF1-BD29-6606851A02C1} = {C4035C32-026F-4158-AF15-113EA1EF1960}
{068F9531-5D29-49E0-980E-59982A3A0469} = {C4035C32-026F-4158-AF15-113EA1EF1960}
EndGlobalSection
EndGlobal

30
SharpDevelop.sln

@ -1,11 +1,16 @@ @@ -1,11 +1,16 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
# SharpDevelop 4.0.0.5490
# SharpDevelop 4.0.0.5639
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Main", "Main", "{256F5C28-532C-44C0-8AB8-D8EC5E492E01}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.BuildWorker", "src\Main\ICSharpCode.SharpDevelop.BuildWorker\ICSharpCode.SharpDevelop.BuildWorker.csproj", "{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartUp", "src\Main\StartUp\Project\StartUp.csproj", "{1152B71B-3C05-4598-B20D-823B5D40559E}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
@ -43,6 +48,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.Presentati @@ -43,6 +48,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.Presentati
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "src\Main\Core\Project\ICSharpCode.Core.csproj", "{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.BuildWorker35", "src\Main\ICSharpCode.SharpDevelop.BuildWorker35\ICSharpCode.SharpDevelop.BuildWorker35.csproj", "{B5F54272-49F0-40DB-845A-8D837875D3BA}"
ProjectSection(ProjectDependencies) = postProject
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{2A232EF1-EB95-41C6-B63A-C106E0C95D3C}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
@ -789,11 +799,28 @@ Global @@ -789,11 +799,28 @@ Global
{E954F3CB-A446-492F-A664-2B376EBC86E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E954F3CB-A446-492F-A664-2B376EBC86E8}.Release|Win32.Build.0 = Release|Any CPU
{E954F3CB-A446-492F-A664-2B376EBC86E8}.Release|Win32.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}.Debug|Win32.Build.0 = Debug|Any CPU
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Debug|Win32.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
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Release|Win32.Build.0 = Release|Any CPU
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}.Release|Win32.ActiveCfg = Release|Any CPU
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Debug|Any CPU.Build.0 = Debug|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Debug|Any CPU.ActiveCfg = Debug|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Debug|Win32.Build.0 = Debug|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Debug|Win32.ActiveCfg = Debug|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Release|Any CPU.Build.0 = Release|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Release|Any CPU.ActiveCfg = Release|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Release|Win32.Build.0 = Release|x86
{B5F54272-49F0-40DB-845A-8D837875D3BA}.Release|Win32.ActiveCfg = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{B5F54272-49F0-40DB-845A-8D837875D3BA} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{7E4A7172-7FF5-48D0-B719-7CD959DD1AC9} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
@ -802,6 +829,7 @@ Global @@ -802,6 +829,7 @@ Global
{2748AD25-9C63-4E12-877B-4DCE96FBED54} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{8035765F-D51F-4A0C-A746-2FD100E19419} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{1152B71B-3C05-4598-B20D-823B5D40559E} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F} = {256F5C28-532C-44C0-8AB8-D8EC5E492E01}
{E5A0F4D8-37FD-4A30-BEB0-4409DC4E0865} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{2FF700C2-A38A-48BD-A637-8CAFD4FE6237} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1} = {2A232EF1-EB95-41C6-B63A-C106E0C95D3C}

5
src/Libraries/AvalonDock/AvalonDock.csproj

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
@ -23,7 +23,8 @@ @@ -23,7 +23,8 @@
<OutputPath>..\..\..\bin\</OutputPath>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<NoStdLib>False</NoStdLib>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<TreatWarningsAsErrors>False</TreatWarningsAsErrors>
<TrackFileAccess>False</TrackFileAccess> <!-- workaround for bug compiling with 32-bit MSBuild 4.0 on 64-bit Windows without having VS2010 installed -->
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>

3
src/Libraries/ICSharpCode.Build.Tasks/Project/ICSharpCode.Build.Tasks.csproj

@ -1,4 +1,5 @@ @@ -1,4 +1,5 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<OutputType>Library</OutputType>
<RootNamespace>ICSharpCode.Build.Tasks</RootNamespace>

3
src/Libraries/TreeViewAdv/Aga.Controls/Aga.Controls.csproj

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
@ -19,6 +19,7 @@ @@ -19,6 +19,7 @@
</SccProvider>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
<TrackFileAccess>false</TrackFileAccess> <!-- workaround for bug compiling with 32-bit MSBuild 4.0 on 64-bit Windows without having VS2010 installed -->
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>

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

@ -30,15 +30,16 @@ @@ -30,15 +30,16 @@
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<DebugType>Full</DebugType>
<DebugSymbols>true</DebugSymbols>
<DefineConstants>DEBUG,TRACE</DefineConstants>
<Optimize>False</Optimize>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
<DefineConstants>DEBUG,TRACE;PUBLICINTERPROCESS</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<DebugSymbols>False</DebugSymbols>
<DebugType>None</DebugType>
<DebugSymbols>false</DebugSymbols>
<DebugType>PdbOnly</DebugType>
<Optimize>True</Optimize>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
<DefineConstants>TRACE;PUBLICINTERPROCESS</DefineConstants>
</PropertyGroup>
<ItemGroup>
<Reference Include="PresentationCore">
@ -67,6 +68,18 @@ @@ -67,6 +68,18 @@
<Reference Include="WindowsFormsIntegration" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\..\ICSharpCode.SharpDevelop.BuildWorker\BuildJob.cs">
<Link>Src\Project\MSBuildEngine\BuildJob.cs</Link>
</Compile>
<Compile Include="..\..\ICSharpCode.SharpDevelop.BuildWorker\EventSource.cs">
<Link>Src\Project\MSBuildEngine\EventSource.cs</Link>
</Compile>
<Compile Include="..\..\ICSharpCode.SharpDevelop.BuildWorker\EventTypes.cs">
<Link>Src\Project\MSBuildEngine\EventTypes.cs</Link>
</Compile>
<Compile Include="..\..\ICSharpCode.SharpDevelop.BuildWorker\ExtendedBinaryReader.cs">
<Link>Src\Project\MSBuildEngine\ExtendedBinaryReader.cs</Link>
</Compile>
<Compile Include="Src\Commands\SharpDevelopRoutedCommands.cs" />
<Compile Include="Src\Editor\AddInHighlightingResource.cs" />
<Compile Include="Src\Editor\AvalonEdit\AvalonEditDocumentAdapter.cs" />
@ -244,9 +257,9 @@ @@ -244,9 +257,9 @@
<Compile Include="Src\Project\IBuildFeedbackSink.cs" />
<Compile Include="Src\Project\IProjectItemBackendStore.cs" />
<Compile Include="Src\Project\MSBuildEngine\BuildLogFileLogger.cs" />
<Compile Include="Src\Project\MSBuildEngine\EventSource.cs" />
<Compile Include="Src\Project\MSBuildEngine\BuildWorkerManager.cs" />
<Compile Include="Src\Project\MSBuildEngine\MSBuildEngine.cs" />
<Compile Include="Src\Project\MSBuildEngine\ParallelMSBuildManager.cs" />
<Compile Include="Src\Project\MSBuildEngine\WorkerProcess.cs" />
<Compile Include="Src\Project\MSBuildFileProject.cs" />
<Compile Include="Src\Project\MSBuildItemWrapper.cs" />
<Compile Include="Src\Project\ProjectLoadInformation.cs" />

184
src/Main/Base/Project/Src/Project/MSBuildEngine/BuildWorkerManager.cs

@ -0,0 +1,184 @@ @@ -0,0 +1,184 @@
// <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.Diagnostics;
using System.IO;
using System.Threading;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.BuildWorker;
using ICSharpCode.SharpDevelop.Project;
using Microsoft.Build.Framework;
namespace ICSharpCode.SharpDevelop.Project
{
sealed class BuildWorkerManager
{
readonly List<BuildWorker> freeWorkers = new List<BuildWorker>();
readonly string workerProcessName;
public static readonly BuildWorkerManager MSBuild40 = new BuildWorkerManager("ICSharpCode.SharpDevelop.BuildWorker40.exe");
public static readonly BuildWorkerManager MSBuild35 = new BuildWorkerManager("ICSharpCode.SharpDevelop.BuildWorker35.exe");
private BuildWorkerManager(string workerProcessName)
{
this.workerProcessName = workerProcessName;
}
public void RunBuildJob(BuildJob job, IEnumerable<ILogger> loggers, IBuildFeedbackSink reportWhenDone)
{
BuildWorker worker = GetFreeWorker();
worker.RunJob(job, loggers, reportWhenDone);
}
BuildWorker GetFreeWorker()
{
lock (freeWorkers) {
if (freeWorkers.Count != 0) {
BuildWorker w = freeWorkers[freeWorkers.Count - 1];
freeWorkers.RemoveAt(freeWorkers.Count - 1);
w.MarkAsInUse();
return w;
}
}
return new BuildWorker(this);
}
sealed class BuildWorker
{
readonly BuildWorkerManager parentManager;
readonly WorkerProcess process;
Timer timer;
bool isFree;
public BuildWorker(BuildWorkerManager parentManager)
{
this.parentManager = parentManager;
string sdbin = Path.GetDirectoryName(typeof(BuildWorker).Assembly.Location);
ProcessStartInfo startInfo = new ProcessStartInfo(Path.Combine(sdbin, parentManager.workerProcessName), "worker");
startInfo.WorkingDirectory = sdbin;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
process = new WorkerProcess(DataArrived);
process.ProcessExited += process_ProcessExited;
process.Start(startInfo);
}
EventSource source;
IEnumerable<ILogger> loggers;
IBuildFeedbackSink reportWhenDone;
CancellationTokenRegistration cancellationRegistration;
public void RunJob(BuildJob job, IEnumerable<ILogger> loggers, IBuildFeedbackSink reportWhenDone)
{
this.source = new EventSource();
this.loggers = loggers;
this.reportWhenDone = reportWhenDone;
foreach (var logger in loggers) {
logger.Initialize(source);
}
try {
process.Writer.Write("StartBuild");
job.WriteTo(process.Writer);
this.cancellationRegistration = reportWhenDone.ProgressMonitor.CancellationToken.Register(OnCancel);
} catch (IOException ex) {
// "Pipe is broken"
source.ForwardEvent(new BuildErrorEventArgs(null, null, null, 0, 0, 0, 0, "Error talking to build worker: " + ex.Message, null, null));
BuildDone(false);
}
}
void OnCancel()
{
LoggingService.Debug("Cancel Build Worker");
process.Writer.Write("Cancel");
}
void DataArrived(string command, BinaryReader reader)
{
LoggingService.Debug("Received command " + command);
switch (command) {
case "ReportEvent":
source.ForwardEvent(EventSource.DecodeEvent(reader));
break;
case "BuildDone":
bool success = reader.ReadBoolean();
BuildDone(success);
MarkAsFree();
break;
case "ReportException":
string ex = reader.ReadString();
MessageService.ShowException(new Exception("Exception from build worker"), ex);
break;
default:
throw new NotSupportedException(command);
}
}
void BuildDone(bool success)
{
lock (this) {
if (reportWhenDone == null)
return;
cancellationRegistration.Dispose();
foreach (var logger in loggers) {
logger.Shutdown();
}
reportWhenDone.Done(success);
reportWhenDone = null;
}
}
void MarkAsFree()
{
lock (parentManager.freeWorkers) {
this.isFree = true;
parentManager.freeWorkers.Add(this);
timer = new Timer(timer_Elapsed, null, 10000, 0);
}
}
void timer_Elapsed(object state)
{
lock (parentManager.freeWorkers) {
if (!isFree)
return; // worker is already being used again
parentManager.freeWorkers.Remove(this);
MarkAsInUse();
}
process.Dispose();
}
void process_ProcessExited(object sender, EventArgs e)
{
bool reportBuildError = false;
lock (parentManager.freeWorkers) {
if (isFree) {
parentManager.freeWorkers.Remove(this);
MarkAsInUse();
} else {
reportBuildError = true;
}
}
if (reportBuildError) {
source.ForwardEvent(new BuildErrorEventArgs(null, null, null, 0, 0, 0, 0, "Build worker process exited unexpectedly.", null, null));
BuildDone(false);
}
process.Dispose();
}
public void MarkAsInUse()
{
Debug.Assert(this.isFree);
this.isFree = false;
timer.Dispose();
}
}
}
}

83
src/Main/Base/Project/Src/Project/MSBuildEngine/EventSource.cs

@ -1,83 +0,0 @@ @@ -1,83 +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 Microsoft.Build.Framework;
using System;
namespace ICSharpCode.SharpDevelop.Project
{
/// <summary>
/// IEventSource implementation. Used to forward events to submission-specific loggers.
/// </summary>
sealed class EventSource : IEventSource, IEventRedirector
{
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;
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
public void ForwardEvent(Microsoft.Build.Framework.BuildEventArgs e)
{
if (e is BuildStatusEventArgs) {
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 TargetStartedEventArgs) {
if (TargetStarted != null)
TargetStarted(this, (TargetStartedEventArgs)e);
} else if (e is TargetFinishedEventArgs) {
if (TargetFinished != null)
TargetFinished(this, (TargetFinishedEventArgs)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);
}
}
}

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

@ -16,6 +16,7 @@ using System.Threading; @@ -16,6 +16,7 @@ using System.Threading;
using System.Xml;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.BuildWorker;
using ICSharpCode.SharpDevelop.Gui;
using Microsoft.Build.Construction;
using Microsoft.Build.Execution;
@ -119,6 +120,9 @@ namespace ICSharpCode.SharpDevelop.Project @@ -119,6 +120,9 @@ namespace ICSharpCode.SharpDevelop.Project
this.feedbackSink = feedbackSink;
}
const EventTypes ControllableEvents = EventTypes.Message | EventTypes.TargetStarted | EventTypes.TargetFinished
| EventTypes.TaskStarted | EventTypes.TaskFinished | EventTypes.Unknown;
/// <summary>
/// Controls whether messages should be made available to loggers.
/// Logger AddIns should set this property in their CreateLogger method.
@ -169,12 +173,6 @@ namespace ICSharpCode.SharpDevelop.Project @@ -169,12 +173,6 @@ namespace ICSharpCode.SharpDevelop.Project
}
void StartBuild()
{
// perform initialization of the build in parallel
ThreadPool.QueueUserWorkItem(RunBuild);
}
void RunBuild(object state)
{
Dictionary<string, string> globalProperties = new Dictionary<string, string>();
MSBuildBasedProject.InitializeMSBuildProjectProperties(globalProperties);
@ -188,7 +186,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -188,7 +186,7 @@ namespace ICSharpCode.SharpDevelop.Project
globalProperties["Platform"] = "AnyCPU";
else
globalProperties["Platform"] = options.Platform;
InterestingTasks.AddRange(MSBuildEngine.CompileTaskNames);
List<ILogger> loggers = new List<ILogger> {
@ -198,15 +196,45 @@ namespace ICSharpCode.SharpDevelop.Project @@ -198,15 +196,45 @@ namespace ICSharpCode.SharpDevelop.Project
foreach (IMSBuildAdditionalLogger loggerProvider in MSBuildEngine.AdditionalMSBuildLoggers) {
loggers.Add(loggerProvider.CreateLogger(this));
}
WriteAdditionalTargetsToTempFile(globalProperties);
// Get ParallelMSBuildManager (or create a new one if one doesn't exist already).
// The serviceContainer will automatically dispose it after the build has completed.
ParallelMSBuildManager manager = (ParallelMSBuildManager)serviceContainer.GetOrCreateService(
typeof(ParallelMSBuildManager),
delegate {
return new ParallelMSBuildManager(new MSBuild.ProjectCollection());
});
BuildJob job = new BuildJob();
job.ProjectFileName = project.FileName;
job.Target = options.Target.TargetName;
// First remove the flags for the controllable events.
job.EventMask = EventTypes.All & ~ControllableEvents;
// Add back active controllable events.
if (ReportMessageEvents)
job.EventMask |= EventTypes.Message;
if (ReportTargetStartedEvents)
job.EventMask |= EventTypes.TargetStarted;
if (ReportTargetFinishedEvents)
job.EventMask |= EventTypes.TargetFinished;
if (ReportAllTaskStartedEvents)
job.EventMask |= EventTypes.TaskStarted;
if (ReportAllTaskFinishedEvents)
job.EventMask |= EventTypes.TaskFinished;
if (ReportUnknownEvents)
job.EventMask |= EventTypes.Unknown;
if (!(ReportAllTaskStartedEvents && ReportAllTaskFinishedEvents)) {
// just some TaskStarted & TaskFinished events should be reported
job.InterestingTaskNames.AddRange(InterestingTasks);
}
foreach (var pair in globalProperties) {
job.Properties.Add(pair.Key, pair.Value);
}
if (project.MinimumSolutionVersion <= Solution.SolutionVersionVS2008) {
BuildWorkerManager.MSBuild35.RunBuildJob(job, loggers, feedbackSink);
} else {
BuildWorkerManager.MSBuild40.RunBuildJob(job, loggers, feedbackSink);
}
}
void WriteAdditionalTargetsToTempFile(Dictionary<string, string> globalProperties)
{
// Using projects with in-memory modifications doesn't work with parallel build.
// As a work-around, we'll write our modifications to a file and force MSBuild to include that file using a custom property.
temporaryFileName = Path.GetTempFileName();
@ -254,67 +282,8 @@ namespace ICSharpCode.SharpDevelop.Project @@ -254,67 +282,8 @@ namespace ICSharpCode.SharpDevelop.Project
#if DEBUG
LoggingService.Debug(File.ReadAllText(temporaryFileName));
#endif
string fileName = project.FileName;
string[] targets = { options.Target.TargetName };
BuildRequestData requestData = new BuildRequestData(fileName, globalProperties, null, targets, new HostServices());
manager.StartBuild(requestData, loggers, OnComplete);
}
void OnComplete(BuildSubmission submission)
{
Debug.Assert(submission.IsCompleted);
feedbackSink.Done(submission.BuildResult.OverallResult == Microsoft.Build.Execution.BuildResultCode.Success);
}
/*
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));
}
BuildJob job = new BuildJob();
job.IntPtrSize = IntPtr.Size;
job.ProjectFileName = project.FileName;
// Never report custom events (those are usually derived EventArgs classes, and SharpDevelop
// doesn't have the matching assemblies loaded - see SD2-1514).
// Also, remove the flags for the controllable events.
job.EventMask = EventTypes.All & ~(ControllableEvents | EventTypes.Custom);
// Add back active controllable events.
if (ReportMessageEvents)
job.EventMask |= EventTypes.Message;
if (ReportTargetStartedEvents)
job.EventMask |= EventTypes.TargetStarted;
if (ReportTargetFinishedEvents)
job.EventMask |= EventTypes.TargetFinished;
if (ReportAllTaskStartedEvents)
job.EventMask |= EventTypes.TaskStarted;
if (ReportAllTaskFinishedEvents)
job.EventMask |= EventTypes.TaskFinished;
if (ReportUnknownEvents)
job.EventMask |= EventTypes.Unknown;
if (!(ReportAllTaskStartedEvents && ReportAllTaskFinishedEvents)) {
// just some TaskStarted & TaskFinished events should be reported
job.InterestingTaskNames.AddRange(InterestingTasks);
}
job.AdditionalImports.AddRange(additionalTargetFiles);
job.Target = options.Target.TargetName;
bool buildInProcess = false;
if (AllowBuildInProcess && Interlocked.CompareExchange(ref isBuildingInProcess, 1, 0) == 0) {
buildInProcess = true;
}
LoggingService.Info("Start job (buildInProcess=" + buildInProcess + "): " + job.ToString());
*/
BuildError currentErrorOrWarning;
/// <summary>
@ -456,6 +425,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -456,6 +425,7 @@ namespace ICSharpCode.SharpDevelop.Project
public void Shutdown()
{
FlushCurrentError();
if (worker.temporaryFileName != null) {
File.Delete(worker.temporaryFileName);
worker.temporaryFileName = null;

242
src/Main/Base/Project/Src/Project/MSBuildEngine/ParallelMSBuildManager.cs

@ -1,242 +0,0 @@ @@ -1,242 +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.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using ICSharpCode.Core;
using Microsoft.Build.Evaluation;
using Microsoft.Build.Execution;
using Microsoft.Build.Framework;
using Microsoft.Build.Logging;
using System.Threading;
namespace ICSharpCode.SharpDevelop.Project
{
/// <summary>
/// Manages parallel access to MSBuild.
///
/// MSBuild only allows a single BuildManager to build at one time, and loggers
/// are specified globally for that BuildManager.
///
/// This class allows to run multiple indepent builds concurrently. Logging events
/// will be forwarded to the appropriate logger.
/// </summary>
public sealed class ParallelMSBuildManager : IDisposable
{
/// <summary>
/// MSBuild only allows a single build to run at one time - so if multiple ParallelMSBuildManager
/// are present, we synchronize them using this global lock.
/// </summary>
static readonly object globalBuildEngineLock = new object();
static bool globalBuildEngineLockTaken;
static void EnterGlobalBuildEngineLock()
{
lock (globalBuildEngineLock) {
while (globalBuildEngineLockTaken)
Monitor.Wait(globalBuildEngineLock);
globalBuildEngineLockTaken = true;
}
}
static void LeaveGlobalBuildEngineLock()
{
lock (globalBuildEngineLock) {
Debug.Assert(globalBuildEngineLockTaken);
globalBuildEngineLockTaken = false;
Monitor.Pulse(globalBuildEngineLock);
}
}
public ProjectCollection ProjectCollection { get; private set; }
/// <summary>
/// Creates a new ParallelMSBuildManager for the project collection.
/// WARNING: only a single ParallelMSBuildManager can build at a time, others will wait.
/// Ensure you dispose the ParallelMSBuildManager when you are done with it, otherwise all future
/// ParallelMSBuildManagers will deadlock!
/// </summary>
public ParallelMSBuildManager(ProjectCollection projectCollection)
{
if (projectCollection == null)
throw new ArgumentNullException("projectCollection");
this.ProjectCollection = projectCollection;
}
#region Manage StartBuild/EndBuild
readonly object enableDisableLock = new object();
bool buildIsRunning;
void StartupBuildEngine()
{
lock (enableDisableLock) {
if (buildIsRunning)
return;
buildIsRunning = true;
LoggingService.Info("ParallelMSBuildManager: waiting for start permission...");
EnterGlobalBuildEngineLock();
LoggingService.Info("ParallelMSBuildManager: got start permisson, starting...");
BuildParameters parameters = new BuildParameters(this.ProjectCollection);
parameters.Loggers = new ILogger[] {
new CentralLogger(this)
};
parameters.EnableNodeReuse = false;
parameters.MaxNodeCount = BuildOptions.DefaultParallelProjectCount;
BuildManager.DefaultBuildManager.BeginBuild(parameters);
}
}
/// <summary>
/// Shuts down the build engine and allows other managers to build.
/// </summary>
public void Dispose()
{
lock (enableDisableLock) {
if (!buildIsRunning)
return;
buildIsRunning = false;
try {
LoggingService.Info("ParallelMSBuildManager shutting down...");
BuildManager.DefaultBuildManager.EndBuild();
BuildManager.DefaultBuildManager.ResetCaches();
LoggingService.Info("ParallelMSBuildManager shut down!");
} finally {
LeaveGlobalBuildEngineLock();
}
}
}
#endregion
readonly Dictionary<int, EventSource> submissionEventSourceMapping = new Dictionary<int, EventSource>();
/// <summary>
/// Starts building.
/// This method blocks if another ParallelMSBuildManager is currently building.
/// However, it doe
/// </summary>
/// <param name="requestData">The requested build.</param>
/// <param name="logger">The logger that received build output.</param>
/// <param name="callback">Callback that is run when the build is complete</param>
/// <returns>The build submission that was started.</returns>
public BuildSubmission StartBuild(BuildRequestData requestData, IEnumerable<ILogger> loggers, BuildSubmissionCompleteCallback callback)
{
if (requestData == null)
throw new ArgumentNullException("requestData");
ILogger[] loggersArray;
if (loggers == null)
loggersArray = new ILogger[0];
else
loggersArray = loggers.ToArray(); // iterate through logger enumerable once
StartupBuildEngine();
BuildSubmission submission = BuildManager.DefaultBuildManager.PendBuildRequest(requestData);
EventSource eventSource = new EventSource();
foreach (ILogger logger in loggersArray) {
if (logger != null)
logger.Initialize(eventSource);
}
lock (submissionEventSourceMapping) {
submissionEventSourceMapping.Add(submission.SubmissionId, eventSource);
}
RunningBuild build = new RunningBuild(this, eventSource, loggersArray, callback);
submission.ExecuteAsync(build.OnComplete, null);
return submission;
}
sealed class RunningBuild
{
ParallelMSBuildManager manager;
ILogger[] loggers;
BuildSubmissionCompleteCallback callback;
EventSource eventSource;
public RunningBuild(ParallelMSBuildManager manager, EventSource eventSource, ILogger[] loggers, BuildSubmissionCompleteCallback callback)
{
this.manager = manager;
this.eventSource = eventSource;
this.loggers = loggers;
this.callback = callback;
}
internal void OnComplete(BuildSubmission submission)
{
lock (manager.submissionEventSourceMapping) {
manager.submissionEventSourceMapping.Remove(submission.SubmissionId);
}
if (submission.BuildResult.Exception != null) {
LoggingService.Error(submission.BuildResult.Exception);
eventSource.ForwardEvent(new BuildErrorEventArgs(null, null, null, 0, 0, 0, 0, submission.BuildResult.Exception.ToString(), null, null));
}
foreach (ILogger logger in loggers) {
if (logger != null)
logger.Shutdown();
}
if (callback != null)
callback(submission);
}
}
sealed class CentralLogger : INodeLogger, IEventRedirector
{
readonly ParallelMSBuildManager parentManager;
public CentralLogger(ParallelMSBuildManager parentManager)
{
this.parentManager = parentManager;
}
public void Initialize(IEventSource eventSource, int nodeCount)
{
Initialize(eventSource);
}
public void Initialize(IEventSource eventSource)
{
eventSource.AnyEventRaised += (sender, e) => ForwardEvent(e);
}
public void Shutdown()
{
}
public string Parameters { get; set; }
public LoggerVerbosity Verbosity { get; set; }
public void ForwardEvent(Microsoft.Build.Framework.BuildEventArgs e)
{
try {
if (e.BuildEventContext == null) {
if (e is BuildStartedEventArgs || e is BuildFinishedEventArgs) {
// these two don't have context set, so we cannot forward them
// this isn't a problem because we know ourselves when we start/stop a build
return;
} else {
throw new InvalidOperationException("BuildEventContext is null on " + e.ToString());
}
}
EventSource redirector;
lock (parentManager.submissionEventSourceMapping) {
if (!parentManager.submissionEventSourceMapping.TryGetValue(e.BuildEventContext.SubmissionId, out redirector)) {
LoggingService.Warn("Could not deliver build event: " + e + ":\n" + e.Message);
}
}
if (redirector != null)
redirector.ForwardEvent(e);
} catch (Exception ex) {
MessageService.ShowException(ex, "Error in build logger");
}
}
}
}
}

128
src/Main/Base/Project/Src/Project/MSBuildEngine/WorkerProcess.cs

@ -0,0 +1,128 @@ @@ -0,0 +1,128 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision: -1 $</version>
// </file>
using System;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.IO.Pipes;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Cryptography;
using System.Threading;
namespace ICSharpCode.SharpDevelop.Project
{
/// <summary>
/// Manages a worker process that communicates with the host using a bidirectional named pipe.
/// </summary>
sealed class WorkerProcess : IDisposable
{
readonly AnonymousPipeServerStream hostToWorkerPipe = new AnonymousPipeServerStream(PipeDirection.Out, HandleInheritability.Inheritable);
readonly AnonymousPipeServerStream workerToHostPipe = new AnonymousPipeServerStream(PipeDirection.In, HandleInheritability.Inheritable);
readonly Process process = new Process();
readonly Thread readerThread;
int id;
volatile bool isDisposed;
readonly Action<string, BinaryReader> dataArrived;
public WorkerProcess(Action<string, BinaryReader> dataArrived)
{
this.dataArrived = dataArrived;
readerThread = new Thread(ReaderThread);
readerThread.IsBackground = true;
}
public void Start(ProcessStartInfo info)
{
if (info == null)
throw new ArgumentNullException("info");
process.StartInfo = info;
Debug.WriteLine("WorkerProcess starting...");
string oldArguments = info.Arguments;
try {
info.Arguments += " " + hostToWorkerPipe.GetClientHandleAsString() + " " + workerToHostPipe.GetClientHandleAsString();
if (!process.Start())
throw new InvalidOperationException("Process.Start() failed");
} finally {
info.Arguments = oldArguments;
// client handles were inherited into started process, dispose our copy
hostToWorkerPipe.DisposeLocalCopyOfClientHandle();
workerToHostPipe.DisposeLocalCopyOfClientHandle();
}
id = process.Id;
readerThread.Start();
this.Writer = new BinaryWriter(hostToWorkerPipe);
Debug.WriteLine("WorkerProcess " + id + " started");
}
void ReaderThread()
{
try {
using (BinaryReader reader = new BinaryReader(workerToHostPipe)) {
while (!isDisposed) {
string text;
try {
text = reader.ReadString();
} catch (EndOfStreamException) {
Core.LoggingService.Debug("Cannot read from WorkerProcess " + id + ": end of stream");
break;
}
dataArrived(text, reader);
}
}
Core.LoggingService.Debug("Stopped reading from WorkerProcess " + id + ".");
if (ProcessExited != null)
ProcessExited(this, EventArgs.Empty);
} catch (Exception ex) {
Core.MessageService.ShowException(ex);
} finally {
Core.LoggingService.Debug("End of reader thread on WorkerProcess " + id + ".");
}
}
public event EventHandler ProcessExited;
public BinaryWriter Writer { get; private set; }
public void Kill()
{
try {
if (!process.HasExited) {
process.Kill();
}
} catch (InvalidOperationException) {
// may occur when the worker process crashes
}
}
public void Dispose()
{
isDisposed = true;
Core.LoggingService.Debug("Telling worker process to exit");
hostToWorkerPipe.Dispose(); // send "end-of-stream" to worker
if (Thread.CurrentThread != readerThread) {
// don't deadlock when disposing from within ReaderThread event
Core.LoggingService.Debug("Waiting for thread-join");
if (!readerThread.Join(3000)) {
Core.LoggingService.Debug("Thread-join failed. Killing worker process.");
Kill();
Core.LoggingService.Debug("Waiting for thread-join");
readerThread.Join();
}
Core.LoggingService.Debug("Joined!");
}
workerToHostPipe.Dispose();
process.Dispose();
}
}
}

10
src/Main/Base/Project/Src/Project/MSBuildInternals.cs

@ -202,12 +202,12 @@ namespace ICSharpCode.SharpDevelop.Project @@ -202,12 +202,12 @@ namespace ICSharpCode.SharpDevelop.Project
List<ILogger> loggers = new List<ILogger>();
if (referenceReplacements == null)
loggers.Add(new SimpleErrorLogger());
using (ParallelMSBuildManager buildManager = new ParallelMSBuildManager(baseProject.MSBuildProjectCollection)) {
BuildSubmission submission = buildManager.StartBuild(requestData, loggers, null);
lock (SolutionProjectCollectionLock) {
BuildParameters parameters = new BuildParameters(baseProject.MSBuildProjectCollection);
parameters.Loggers = loggers;
LoggingService.Debug("Started build for ResolveAssemblyReferences");
submission.WaitHandle.WaitOne();
BuildResult result = submission.BuildResult;
BuildResult result = BuildManager.DefaultBuildManager.Build(parameters, requestData);
if (result == null)
throw new InvalidOperationException("BuildResult is null");
LoggingService.Debug("Build for ResolveAssemblyReferences finished: " + result.OverallResult);

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

@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace ICSharpCode.SharpDevelop.BuildWorker
@ -14,17 +15,8 @@ namespace ICSharpCode.SharpDevelop.BuildWorker @@ -14,17 +15,8 @@ namespace ICSharpCode.SharpDevelop.BuildWorker
/// <summary>
/// The settings used to start a build.
/// </summary>
[Serializable]
public class BuildJob
class BuildJob
{
/// <summary>
/// The value of IntPtr.Size on the host. The build worker will report an error if its IntPtr.Size
/// doesn't match. This is a safety feature to prevent compiling half of a solution using 32-bit MSBuild
/// and the other half using 64-bit MSBuild.
/// </summary>
public int IntPtrSize { get; set; }
public string ProjectFileName { get; set; }
public string Target { get; set; }
@ -44,12 +36,6 @@ namespace ICSharpCode.SharpDevelop.BuildWorker @@ -44,12 +36,6 @@ namespace ICSharpCode.SharpDevelop.BuildWorker
get { return properties; }
}
List<string> additionalImports = new List<string>();
public IList<string> AdditionalImports {
get { return additionalImports; }
}
HashSet<string> interestingTaskNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
public ICollection<string> InterestingTaskNames {
@ -66,10 +52,10 @@ namespace ICSharpCode.SharpDevelop.BuildWorker @@ -66,10 +52,10 @@ namespace ICSharpCode.SharpDevelop.BuildWorker
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);
}
// b.AppendLine(" " + AdditionalImports.Count + " Additional Imports:");
// foreach (string import in AdditionalImports) {
// b.AppendLine(" " + import);
// }
b.AppendLine(" " + InterestingTaskNames.Count + " Interesting Task Names:");
foreach (string name in InterestingTaskNames) {
b.AppendLine(" " + name);
@ -77,14 +63,38 @@ namespace ICSharpCode.SharpDevelop.BuildWorker @@ -77,14 +63,38 @@ namespace ICSharpCode.SharpDevelop.BuildWorker
return b.ToString();
}
[NonSerialized]
internal Action CancelCallback;
public void WriteTo(BinaryWriter writer)
{
writer.Write(this.ProjectFileName);
writer.Write(this.Target);
writer.WriteInt32((int)eventMask);
writer.WriteInt32(properties.Count);
foreach (var pair in properties) {
writer.Write(pair.Key);
writer.Write(pair.Value);
}
writer.WriteInt32(interestingTaskNames.Count);
foreach (string taskName in interestingTaskNames)
writer.Write(taskName);
}
public void Cancel()
public static BuildJob ReadFrom(BinaryReader reader)
{
if (CancelCallback != null) {
CancelCallback();
BuildJob job = new BuildJob();
job.ProjectFileName = reader.ReadString();
job.Target = reader.ReadString();
job.EventMask = (EventTypes)reader.ReadInt32();
int c = reader.ReadInt32();
for (int i = 0; i < c; i++) {
job.properties.Add(reader.ReadString(), reader.ReadString());
}
c = reader.ReadInt32();
for (int i = 0; i < c; i++) {
job.interestingTaskNames.Add(reader.ReadString());
}
return job;
}
}
}

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

@ -6,31 +6,12 @@ @@ -6,31 +6,12 @@
// </file>
using System;
using System.IO;
using Microsoft.Build.Framework;
namespace ICSharpCode.SharpDevelop.BuildWorker
{
[Flags]
public enum EventTypes
{
None = 0,
Message = 0x0001,
Error = 0x0002,
Warning = 0x0004,
BuildStarted = 0x0008,
BuildFinished = 0x0010,
ProjectStarted = 0x0020,
ProjectFinished = 0x0040,
TargetStarted = 0x0080,
TargetFinished = 0x0100,
TaskStarted = 0x0200,
TaskFinished = 0x0400,
Custom = 0x0800,
Unknown = 0x1000,
All = 0x1fff
}
class EventSource : IEventSource
class EventSource : IEventSource, IEventRedirector
{
public event BuildMessageEventHandler MessageRaised;
public event BuildErrorEventHandler ErrorRaised;
@ -48,8 +29,148 @@ namespace ICSharpCode.SharpDevelop.BuildWorker @@ -48,8 +29,148 @@ namespace ICSharpCode.SharpDevelop.BuildWorker
public event AnyEventHandler AnyEventRaised;
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
public void RaiseEvent(BuildEventArgs e)
public static void EncodeEvent(BinaryWriter writer, BuildEventArgs e)
{
EventTypes type = GetEventType(e);
writer.WriteInt32((int)type);
writer.WriteNullableString(e.Message);
writer.WriteNullableString(e.HelpKeyword);
writer.WriteNullableString(e.SenderName);
writer.WriteDateTime(e.Timestamp);
switch (type) {
case EventTypes.Error:
BuildErrorEventArgs error = (BuildErrorEventArgs)e;
writer.WriteNullableString(error.Subcategory);
writer.WriteNullableString(error.Code);
writer.WriteNullableString(error.File);
writer.WriteInt32(error.LineNumber);
writer.WriteInt32(error.ColumnNumber);
writer.WriteInt32(error.EndLineNumber);
writer.WriteInt32(error.EndColumnNumber);
break;
case EventTypes.Warning:
BuildWarningEventArgs warning = (BuildWarningEventArgs)e;
writer.WriteNullableString(warning.Subcategory);
writer.WriteNullableString(warning.Code);
writer.WriteNullableString(warning.File);
writer.WriteInt32(warning.LineNumber);
writer.WriteInt32(warning.ColumnNumber);
writer.WriteInt32(warning.EndLineNumber);
writer.WriteInt32(warning.EndColumnNumber);
break;
case EventTypes.Message:
BuildMessageEventArgs message = (BuildMessageEventArgs)e;
writer.WriteInt32((int)message.Importance);
break;
case EventTypes.BuildFinished:
BuildFinishedEventArgs buildFinished = (BuildFinishedEventArgs)e;
writer.Write(buildFinished.Succeeded);
break;
case EventTypes.BuildStarted:
break;
case EventTypes.ProjectFinished:
ProjectFinishedEventArgs projectFinished = (ProjectFinishedEventArgs)e;
writer.WriteNullableString(projectFinished.ProjectFile);
writer.Write(projectFinished.Succeeded);
break;
case EventTypes.ProjectStarted:
ProjectStartedEventArgs projectStarted = (ProjectStartedEventArgs)e;
writer.WriteNullableString(projectStarted.ProjectFile);
writer.WriteNullableString(projectStarted.TargetNames);
break;
case EventTypes.TargetFinished:
TargetFinishedEventArgs targetFinished = (TargetFinishedEventArgs)e;
writer.WriteNullableString(targetFinished.TargetName);
writer.WriteNullableString(targetFinished.ProjectFile);
writer.WriteNullableString(targetFinished.TargetFile);
writer.Write(targetFinished.Succeeded);
break;
case EventTypes.TargetStarted:
TargetStartedEventArgs targetStarted = (TargetStartedEventArgs)e;
writer.WriteNullableString(targetStarted.TargetName);
writer.WriteNullableString(targetStarted.ProjectFile);
writer.WriteNullableString(targetStarted.TargetFile);
#if MSBUILD35
writer.WriteNullableString(null);
#else
writer.WriteNullableString(targetStarted.ParentTarget);
#endif
break;
case EventTypes.TaskFinished:
TaskFinishedEventArgs taskFinished = (TaskFinishedEventArgs)e;
writer.WriteNullableString(taskFinished.ProjectFile);
writer.WriteNullableString(taskFinished.TaskFile);
writer.WriteNullableString(taskFinished.TaskName);
writer.Write(taskFinished.Succeeded);
break;
case EventTypes.TaskStarted:
TaskStartedEventArgs taskStarted = (TaskStartedEventArgs)e;
writer.WriteNullableString(taskStarted.ProjectFile);
writer.WriteNullableString(taskStarted.TaskFile);
writer.WriteNullableString(taskStarted.TaskName);
break;
default: // unknown etc.
break;
}
}
#if !MSBUILD35
public static BuildEventArgs DecodeEvent(BinaryReader reader)
{
EventTypes type = (EventTypes)reader.ReadInt32();
string message = reader.ReadNullableString();
string helpKeyword = reader.ReadNullableString();
string senderName = reader.ReadNullableString();
DateTime eventTimestamp = reader.ReadDateTime();
switch (type) {
case EventTypes.Error:
return new BuildErrorEventArgs(reader.ReadNullableString(), reader.ReadNullableString(), reader.ReadNullableString(),
reader.ReadInt32(), reader.ReadInt32(), reader.ReadInt32(), reader.ReadInt32(),
message, helpKeyword, senderName, eventTimestamp);
case EventTypes.Warning:
return new BuildWarningEventArgs(reader.ReadNullableString(), reader.ReadNullableString(), reader.ReadNullableString(),
reader.ReadInt32(), reader.ReadInt32(), reader.ReadInt32(), reader.ReadInt32(),
message, helpKeyword, senderName, eventTimestamp);
case EventTypes.Message:
MessageImportance importance = (MessageImportance)reader.ReadInt32();
return new BuildMessageEventArgs(message, helpKeyword, senderName, importance, eventTimestamp);
case EventTypes.BuildFinished:
return new BuildFinishedEventArgs(message, helpKeyword, reader.ReadBoolean(), eventTimestamp);
case EventTypes.BuildStarted:
return new BuildStartedEventArgs(message, helpKeyword, eventTimestamp);
case EventTypes.ProjectFinished:
return new ProjectFinishedEventArgs(message, helpKeyword, reader.ReadNullableString(), reader.ReadBoolean(), eventTimestamp);
case EventTypes.ProjectStarted:
return new ProjectStartedEventArgs(message, helpKeyword, reader.ReadNullableString(), reader.ReadNullableString(),
null, null, eventTimestamp);
case EventTypes.TargetFinished:
return new TargetFinishedEventArgs(message, helpKeyword, reader.ReadNullableString(), reader.ReadNullableString(),
reader.ReadNullableString(), reader.ReadBoolean(), eventTimestamp, null);
case EventTypes.TargetStarted:
return new TargetStartedEventArgs(message, helpKeyword, reader.ReadNullableString(), reader.ReadNullableString(),
reader.ReadNullableString(), reader.ReadNullableString(), eventTimestamp);
case EventTypes.TaskFinished:
return new TaskFinishedEventArgs(message, helpKeyword, reader.ReadNullableString(), reader.ReadNullableString(),
reader.ReadNullableString(), reader.ReadBoolean(), eventTimestamp);
case EventTypes.TaskStarted:
return new TaskStartedEventArgs(message, helpKeyword, reader.ReadNullableString(), reader.ReadNullableString(),
reader.ReadNullableString(), eventTimestamp);
default:
return new UnknownBuildEventArgs(message, helpKeyword, senderName, eventTimestamp);
}
}
sealed class UnknownBuildEventArgs : CustomBuildEventArgs
{
public UnknownBuildEventArgs(string message, string helpKeyword, string senderName, DateTime eventTimestamp)
: base(message, helpKeyword, senderName, eventTimestamp)
{
}
}
#endif
public void ForwardEvent(BuildEventArgs e)
{
if (e is BuildStatusEventArgs) {
if (e is TaskStartedEventArgs) {

32
src/Main/ICSharpCode.SharpDevelop.BuildWorker/EventTypes.cs

@ -0,0 +1,32 @@ @@ -0,0 +1,32 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision: 5640 $</version>
// </file>
using System;
using Microsoft.Build.Framework;
namespace ICSharpCode.SharpDevelop.BuildWorker
{
[Flags]
enum EventTypes
{
None = 0,
Message = 0x0001,
Error = 0x0002,
Warning = 0x0004,
BuildStarted = 0x0008,
BuildFinished = 0x0010,
ProjectStarted = 0x0020,
ProjectFinished = 0x0040,
TargetStarted = 0x0080,
TargetFinished = 0x0100,
TaskStarted = 0x0200,
TaskFinished = 0x0400,
Custom = 0x0800,
Unknown = 0x1000,
All = 0x1fff
}
}

45
src/Main/ICSharpCode.SharpDevelop.BuildWorker/ExtendedBinaryReader.cs

@ -0,0 +1,45 @@ @@ -0,0 +1,45 @@
// <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;
namespace ICSharpCode.SharpDevelop.BuildWorker
{
static class BinaryReaderExtensions
{
public static string ReadNullableString(this BinaryReader reader)
{
if (reader.ReadBoolean())
return reader.ReadString();
else
return null;
}
public static void WriteNullableString(this BinaryWriter writer, string s)
{
writer.Write(s != null);
if (s != null)
writer.Write(s);
}
public static DateTime ReadDateTime(this BinaryReader reader)
{
return new DateTime(reader.ReadInt64());
}
public static void WriteDateTime(this BinaryWriter writer, DateTime date)
{
writer.Write(date.Ticks);
}
public static void WriteInt32(this BinaryWriter writer, int val)
{
writer.Write(val);
}
}
}

53
src/Main/ICSharpCode.SharpDevelop.BuildWorker/HostProcess.cs

@ -0,0 +1,53 @@ @@ -0,0 +1,53 @@
// <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.Globalization;
using System.IO;
using System.IO.Pipes;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Threading;
namespace ICSharpCode.SharpDevelop.Interprocess
{
/// <summary>
/// Used in the worker process to refer to the host.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable")]
sealed class HostProcess
{
readonly AnonymousPipeClientStream hostToWorkerPipe;
readonly AnonymousPipeClientStream workerToHostPipe;
public HostProcess(string pipe1, string pipe2)
{
hostToWorkerPipe = new AnonymousPipeClientStream(PipeDirection.In, pipe1);
workerToHostPipe = new AnonymousPipeClientStream(PipeDirection.Out, pipe2);
this.Writer = new BinaryWriter(workerToHostPipe);
}
public BinaryWriter Writer { get; private set; }
public void Run(Action<string, BinaryReader> dataReceived)
{
using (BinaryReader reader = new BinaryReader(hostToWorkerPipe)) {
while (true) {
string command;
try {
command = reader.ReadString();
} catch (EndOfStreamException) {
break;
}
dataReceived(command, reader);
}
}
}
}
}

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

@ -1,12 +1,13 @@ @@ -1,12 +1,13 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<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>
<AssemblyName>ICSharpCode.SharpDevelop.BuildWorker40</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<NoStdLib>False</NoStdLib>
<WarningLevel>4</WarningLevel>
@ -35,14 +36,14 @@ @@ -35,14 +36,14 @@
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
<RegisterForComInterop>False</RegisterForComInterop>
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<BaseAddress>4194304</BaseAddress>
<PlatformTarget>x86</PlatformTarget>
<FileAlignment>4096</FileAlignment>
</PropertyGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
<ItemGroup>
<Reference Include="Microsoft.Build.Engine" />
<Reference Include="Microsoft.Build" />
<Reference Include="Microsoft.Build.Framework" />
<Reference Include="System" />
<Reference Include="System.Core">
@ -58,17 +59,11 @@ @@ -58,17 +59,11 @@
<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="EventTypes.cs" />
<Compile Include="ExtendedBinaryReader.cs" />
<Compile Include="HostProcess.cs" />
<Compile Include="MSBuild40.cs" />
<Compile Include="Program.cs" />
<Compile Include="WorkerManager.cs" />
<None Include="app.config" />
</ItemGroup>
<ItemGroup>
<Folder Include="Configuration" />
<Folder Include="Interprocess" />
</ItemGroup>
</Project>

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

@ -1,112 +0,0 @@ @@ -1,112 +0,0 @@
// <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.Globalization;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Threading;
namespace ICSharpCode.SharpDevelop.BuildWorker.Interprocess
{
/// <summary>
/// Used in the worker process to refer to the host.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable")]
public class HostProcess
{
readonly object workerObject;
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1720:AvoidTypeNamesInParameters")]
public HostProcess(object workerObject)
{
if (workerObject == null)
throw new ArgumentNullException("workerObject");
this.workerObject = workerObject;
}
TcpClient client;
PacketReceiver receiver;
PacketSender sender;
ManualResetEvent shutdownEvent;
bool connectionIsLost;
internal const int SendKeepAliveInterval = 10000;
public void WorkerProcessMain(string argument, string passwordBase64)
{
int port = int.Parse(argument, CultureInfo.InvariantCulture);
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;
// send password
sender.Send(Convert.FromBase64String(passwordBase64));
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)
{
Program.Log("CallMethodOnHost: " + methodName);
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();
}
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
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.ToString());
} catch (Exception ex) {
Program.Log(ex.ToString());
CallMethodOnHost("ReportException", ex.ToString());
}
}
}
}
}

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

@ -1,16 +0,0 @@ @@ -1,16 +0,0 @@
// <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(string exceptionText);
}
}

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

@ -1,148 +0,0 @@ @@ -1,148 +0,0 @@
// <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;
}
if (bytes == 0) {
// 0 bytes read indicates the end of the stream
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));
}
if (bufferReadOffset >= buffer.Length) {
// should never happen - the buffer now is large enough to contain the packet,
// and we would have already processed the packet if received it completely
throw new InvalidOperationException("trying to read 0 bytes from socket");
}
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;
}
}
}

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

@ -1,70 +0,0 @@ @@ -1,70 +0,0 @@
// <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 (IOException ex) {
ICSharpCode.SharpDevelop.BuildWorker.Program.Log(ex.ToString());
OnWriteFailed();
} catch (ObjectDisposedException ex) {
ICSharpCode.SharpDevelop.BuildWorker.Program.Log(ex.ToString());
OnWriteFailed();
}
}
void OnWriteFailed()
{
if (WriteFailed != null)
WriteFailed(this, EventArgs.Empty);
}
public event EventHandler WriteFailed;
}
}

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

@ -1,270 +0,0 @@ @@ -1,270 +0,0 @@
// <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.Globalization;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Cryptography;
using System.Threading;
namespace ICSharpCode.SharpDevelop.BuildWorker.Interprocess
{
/// <summary>
/// Manages a worker process that communicates with the host using a local TCP connection.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable")]
public sealed class WorkerProcess
{
readonly object hostObject;
public WorkerProcess(IHostObject hostObject)
{
if (hostObject == null)
throw new ArgumentNullException("hostObject");
this.hostObject = hostObject;
}
TcpListener listener;
Process process;
TcpClient client;
PacketSender sender;
PacketReceiver receiver;
// We use TCP, so we'll have to deal with "attackers" trying to hijack our connection.
// There are two lines of defense:
// 1. the only local connections are accepted
// 2. the client must authenticate with a random password
// We're not protecting against DOS - we're only vulnerable to local attackers during a short
// time frame. The password is only to defend against deserializing arbitrary objects from
// unauthenticated clients.
// We probably should use Named Pipes instead of TCP.
byte[] password;
bool clientAuthenticated;
public void Start(ProcessStartInfo info)
{
if (info == null)
throw new ArgumentNullException("info");
password = new byte[16];
new RNGCryptoServiceProvider().GetBytes(password);
listener = new TcpListener(IPAddress.Loopback, 0);
listener.Start();
string argument = ((IPEndPoint)listener.LocalEndpoint).Port.ToString(CultureInfo.InvariantCulture);
string oldArguments = info.Arguments;
info.Arguments += " " + argument + " " + Convert.ToBase64String(password);
process = Process.Start(info);
// "manual process start" - useful for profiling the build worker
//System.Windows.Forms.MessageBox.Show(info.Arguments);
//process = Process.GetProcessesByName("ICSharpCode.SharpDevelop.BuildWorker")[0];
info.Arguments = oldArguments;
SetTimeout();
listener.BeginAcceptTcpClient(OnAcceptTcpClient, null);
}
Timer currentTimer;
void SetTimeout()
{
lock (this) {
ClearTimeout();
currentTimer = new Timer(OnTimeout, null, HostProcess.SendKeepAliveInterval * 5 / 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)
{
clientAuthenticated = false;
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) {
if (clientAuthenticated) {
MethodCall mc = (MethodCall)DeserializeObject(e.Packet);
mc.CallOn(hostObject);
} else {
if (ArrayEquals(e.Packet, password)) {
clientAuthenticated = true;
} else {
Kill();
throw new InvalidOperationException("Worker process authentication failed.");
}
}
}
}
static bool ArrayEquals(byte[] a, byte[] b)
{
if (a.Length != b.Length)
return false;
for (int i = 0; i < a.Length; i++) {
if (a[i] != b[i])
return false;
}
return true;
}
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)
{
Debug.WriteLine("CallMethodOnWorker: " + methodName);
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, CultureInfo.InvariantCulture);
}
}
}
}

39
src/Main/ICSharpCode.SharpDevelop.BuildWorker/MSBuild40.cs

@ -0,0 +1,39 @@ @@ -0,0 +1,39 @@
// <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.Execution;
using Microsoft.Build.Framework;
namespace ICSharpCode.SharpDevelop.BuildWorker
{
sealed class MSBuildWrapper
{
public void Cancel()
{
BuildManager.DefaultBuildManager.CancelAllSubmissions();
}
public MSBuildWrapper()
{
}
public bool DoBuild(BuildJob job, ILogger logger)
{
BuildParameters parameters = new BuildParameters();
parameters.MaxNodeCount = 1;
parameters.Loggers = new ILogger[] { logger };
Program.Log("Building target '" + job.Target + "' in " + job.ProjectFileName);
string[] targets = job.Target.Split(';');
BuildRequestData request = new BuildRequestData(job.ProjectFileName, job.Properties, null, targets, null);
BuildResult result = BuildManager.DefaultBuildManager.Build(parameters, request);
return result.OverallResult == BuildResultCode.Success;
}
}
}

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

@ -15,13 +15,12 @@ using System.IO; @@ -15,13 +15,12 @@ using System.IO;
using System.Runtime.Serialization;
using System.Threading;
using ICSharpCode.SharpDevelop.BuildWorker.Interprocess;
using Microsoft.Build.BuildEngine;
using ICSharpCode.SharpDevelop.Interprocess;
using Microsoft.Build.Framework;
namespace ICSharpCode.SharpDevelop.BuildWorker
{
class Program
sealed class Program
{
static HostProcess host;
BuildJob currentJob;
@ -34,8 +33,8 @@ namespace ICSharpCode.SharpDevelop.BuildWorker @@ -34,8 +33,8 @@ namespace ICSharpCode.SharpDevelop.BuildWorker
if (args.Length == 3 && args[0] == "worker") {
try {
host = new HostProcess(new Program());
host.WorkerProcessMain(args[1], args[2]);
host = new HostProcess(args[1], args[2]);
host.Run(new Program().DataReceived);
} catch (Exception ex) {
ShowMessageBox(ex.ToString());
}
@ -47,6 +46,22 @@ namespace ICSharpCode.SharpDevelop.BuildWorker @@ -47,6 +46,22 @@ namespace ICSharpCode.SharpDevelop.BuildWorker
}
}
readonly MSBuildWrapper buildWrapper = new MSBuildWrapper();
void DataReceived(string command, BinaryReader reader)
{
switch (command) {
case "StartBuild":
StartBuild(BuildJob.ReadFrom(reader));
break;
case "Cancel":
CancelBuild();
break;
default:
throw new InvalidOperationException("Unknown command");
}
}
static void AppDomain_CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
ShowMessageBox(e.ExceptionObject.ToString());
@ -56,18 +71,6 @@ namespace ICSharpCode.SharpDevelop.BuildWorker @@ -56,18 +71,6 @@ namespace ICSharpCode.SharpDevelop.BuildWorker
#error WORKERDEBUG must not be defined if RELEASE is defined
#endif
internal static ProcessStartInfo CreateStartInfo()
{
ProcessStartInfo info = new ProcessStartInfo(typeof(Program).Assembly.Location);
info.WorkingDirectory = Path.GetDirectoryName(info.FileName);
info.Arguments = "worker";
info.UseShellExecute = false;
#if RELEASE || !WORKERDEBUG
info.CreateNoWindow = true;
#endif
return info;
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1300:SpecifyMessageBoxOptions")]
internal static void ShowMessageBox(string text)
{
@ -84,7 +87,6 @@ namespace ICSharpCode.SharpDevelop.BuildWorker @@ -84,7 +87,6 @@ namespace ICSharpCode.SharpDevelop.BuildWorker
#endif
}
// Called with CallMethodOnWorker
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public void StartBuild(BuildJob job)
{
@ -108,13 +110,14 @@ namespace ICSharpCode.SharpDevelop.BuildWorker @@ -108,13 +110,14 @@ namespace ICSharpCode.SharpDevelop.BuildWorker
thread.Start();
}
// Called with CallMethodOnWorker
//[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
// TODO: make use of CancelBuild
public void CancelBuild()
{
Program.Log("CancelBuild()");
lock (this) {
requestCancellation = true;
if (!requestCancellation) {
requestCancellation = true;
buildWrapper.Cancel();
}
}
}
@ -124,9 +127,10 @@ namespace ICSharpCode.SharpDevelop.BuildWorker @@ -124,9 +127,10 @@ namespace ICSharpCode.SharpDevelop.BuildWorker
Program.Log("In build thread");
bool success = false;
try {
success = DoBuild();
success = buildWrapper.DoBuild(currentJob, new ForwardingLogger(this));
} catch (Exception ex) {
host.CallMethodOnHost("ReportException", ex.ToString());
host.Writer.Write("ReportException");
host.Writer.Write(ex.ToString());
} finally {
Program.Log("BuildDone");
@ -139,164 +143,15 @@ namespace ICSharpCode.SharpDevelop.BuildWorker @@ -139,164 +143,15 @@ namespace ICSharpCode.SharpDevelop.BuildWorker
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));
//engine.RegisterLogger(new ConsoleLogger(LoggerVerbosity.Diagnostic));
return engine;
}
EventSource hostEventSource;
internal void BuildInProcess(BuildSettings settings, BuildJob job)
{
lock (this) {
if (currentJob != null)
throw new InvalidOperationException("Already running a job");
currentJob = job;
requestCancellation = false;
hostEventSource = new EventSource();
}
job.CancelCallback = delegate {
lock (this) {
if (currentJob == job) {
requestCancellation = true;
}
}
};
bool success = false;
try {
foreach (ILogger logger in settings.Logger) {
logger.Initialize(hostEventSource);
}
success = DoBuild();
foreach (ILogger logger in settings.Logger) {
logger.Shutdown();
}
} finally {
lock (this) {
currentJob = null;
}
if (settings.BuildDoneCallback != null)
settings.BuildDoneCallback(success);
host.Writer.Write("BuildDone");
host.Writer.Write(success);
}
}
Engine engine;
Dictionary<string, string> lastJobProperties;
// Fix for SD2-1533 - Project configurations get confused
// Whenever the global properties change, we have to create a new Engine
// to ensure MSBuild doesn't cache old paths
bool GlobalPropertiesChanged(Dictionary<string, string> newJobProperties)
{
Debug.Assert(newJobProperties != null);
if (lastJobProperties == null || lastJobProperties.Count != newJobProperties.Count) {
Log("Recreating engine: Number of build properties changed");
return true;
}
foreach (KeyValuePair<string, string> pair in lastJobProperties) {
string val;
if (!newJobProperties.TryGetValue(pair.Key, out val)) {
Log("Recreating engine: Build property removed: " + pair.Key);
return true;
}
if (val != pair.Value) {
Log("Recreating engine: Build property changed: " + pair.Key);
return true;
}
}
return false;
}
bool DoBuild()
{
if (currentJob.IntPtrSize != IntPtr.Size)
throw new ApplicationException("Incompatible IntPtr.Size between host and worker");
if (engine == null || GlobalPropertiesChanged(currentJob.Properties)) {
engine = CreateEngine();
lastJobProperties = currentJob.Properties;
engine.GlobalProperties.Clear();
foreach (KeyValuePair<string, string> pair in currentJob.Properties) {
engine.GlobalProperties.SetProperty(pair.Key, pair.Value);
}
}
Log("Loading " + currentJob.ProjectFileName);
Project project = LoadProject(engine, currentJob.ProjectFileName);
if (project == null)
return false;
if (string.IsNullOrEmpty(currentJob.Target)) {
Log("Building default target in " + currentJob.ProjectFileName);
return engine.BuildProject(project);
} else {
Log("Building target '" + currentJob.Target + "' in " + currentJob.ProjectFileName);
return engine.BuildProject(project, currentJob.Target.Split(';'));
}
}
Project LoadProject(Engine engine, string fileName)
{
Project project = engine.CreateNewProject();
try {
project.Load(fileName);
/* No longer necessary as we stopped using BuildingInsideVisualStudio
// 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)
{
HostReportEvent(e);
}
void HostReportEvent(BuildEventArgs e)
{
if (host != null) {
host.CallMethodOnHost("ReportEvent", e);
} else {
// enable error reporting for in-process builds
EventSource eventSource = hostEventSource;
if (eventSource != null) {
eventSource.RaiseEvent(e);
}
}
host.Writer.Write("ReportEvent");
EventSource.EncodeEvent(host.Writer, e);
}
sealed class ForwardingLogger : ILogger
@ -347,8 +202,6 @@ namespace ICSharpCode.SharpDevelop.BuildWorker @@ -347,8 +202,6 @@ namespace ICSharpCode.SharpDevelop.BuildWorker
eventSource.CustomEventRaised += OnEvent;
if ((eventMask & EventTypes.Unknown) != 0)
eventSource.AnyEventRaised += OnUnknownEventRaised;
if (eventMask != EventTypes.All)
eventSource.AnyEventRaised += OnAnyEvent;
#if WORKERDEBUG
eventSource.AnyEventRaised += CountEvent;
@ -388,28 +241,15 @@ namespace ICSharpCode.SharpDevelop.BuildWorker @@ -388,28 +241,15 @@ namespace ICSharpCode.SharpDevelop.BuildWorker
eventSource.CustomEventRaised -= OnEvent;
if ((eventMask & EventTypes.Unknown) != 0)
eventSource.AnyEventRaised -= OnUnknownEventRaised;
if (eventMask != EventTypes.All)
eventSource.AnyEventRaised -= OnAnyEvent;
#if WORKERDEBUG
eventSource.AnyEventRaised -= CountEvent;
#endif
}
// registered for AnyEventRaised to support build cancellation.
// is not registered if all events should be forwarded, in that case, OnEvent
// already handles build cancellation
void OnAnyEvent(object sender, BuildEventArgs e)
{
if (program.requestCancellation)
throw new BuildCancelException();
}
// used for all events that should be forwarded
void OnEvent(object sender, BuildEventArgs e)
{
if (program.requestCancellation)
throw new BuildCancelException();
program.HostReportEvent(e);
}

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

@ -1,274 +0,0 @@ @@ -1,274 +0,0 @@
// <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) {
Debug.WriteLine("WorkerManager: shutting down free worker");
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)
{
Debug.WriteLine(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)
{
BuildRun buildRun;
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 = 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
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public void ReportEvent(BuildEventArgs e)
{
BuildRun buildRun = currentBuildRun;
if (buildRun != null) {
buildRun.RaiseEvent(e);
}
}
// Called with CallMethodOnHost
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public void BuildDone(bool success)
{
BuildRun buildRun;
lock (lockObject) {
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);
}
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
public void ReportException(string exceptionText)
{
// shutdown worker if it produced an exception
try {
process.Shutdown();
} catch {}
if (ShowError != null)
ShowError(new Exception(exceptionText));
else
Program.ShowMessageBox(exceptionText);
}
}
}
public sealed class BuildSettings
{
List<ILogger> logger = new List<ILogger>();
public Action<bool> BuildDoneCallback { get; set; }
public ICollection<ILogger> Logger {
get { return logger; }
}
}
}

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

@ -1,14 +1,18 @@ @@ -1,14 +1,18 @@
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<!-- redirect MSBuild.Framework requests to make old task assemblies work with MSBuild 3.5 -->
<!-- redirect MSBuild.Framework requests to make old task assemblies work with MSBuild 4.0 -->
<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"/>
<bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="4.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Build.Engine" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="4.0.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"/>
<bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="10.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>

78
src/Main/ICSharpCode.SharpDevelop.BuildWorker35/ICSharpCode.SharpDevelop.BuildWorker35.csproj

@ -0,0 +1,78 @@ @@ -0,0 +1,78 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<PropertyGroup>
<ProjectGuid>{B5F54272-49F0-40DB-845A-8D837875D3BA}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<OutputType>Exe</OutputType>
<RootNamespace>ICSharpCode.SharpDevelop.BuildWorker35</RootNamespace>
<AssemblyName>ICSharpCode.SharpDevelop.BuildWorker35</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<AppDesignerFolder>Properties</AppDesignerFolder>
<OutputPath>..\..\..\bin\</OutputPath>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<NoStdLib>False</NoStdLib>
<WarningLevel>4</WarningLevel>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'x86' ">
<PlatformTarget>x86</PlatformTarget>
<RegisterForComInterop>False</RegisterForComInterop>
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
<BaseAddress>4194304</BaseAddress>
<FileAlignment>4096</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>Full</DebugType>
<Optimize>False</Optimize>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
<DefineConstants>DEBUG;TRACE;MSBUILD35</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<DebugSymbols>false</DebugSymbols>
<DebugType>None</DebugType>
<Optimize>True</Optimize>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
<DefineConstants>TRACE;MSBUILD35</DefineConstants>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.Build.Engine" />
<Reference Include="Microsoft.Build.Framework" />
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\GlobalAssemblyInfo.cs">
<Link>Properties\GlobalAssemblyInfo.cs</Link>
</Compile>
<Compile Include="..\ICSharpCode.SharpDevelop.BuildWorker\BuildJob.cs">
<Link>BuildJob.cs</Link>
</Compile>
<Compile Include="..\ICSharpCode.SharpDevelop.BuildWorker\EventSource.cs">
<Link>EventSource.cs</Link>
</Compile>
<Compile Include="..\ICSharpCode.SharpDevelop.BuildWorker\EventTypes.cs">
<Link>EventTypes.cs</Link>
</Compile>
<Compile Include="..\ICSharpCode.SharpDevelop.BuildWorker\ExtendedBinaryReader.cs">
<Link>ExtendedBinaryReader.cs</Link>
</Compile>
<Compile Include="..\ICSharpCode.SharpDevelop.BuildWorker\HostProcess.cs">
<Link>HostProcess.cs</Link>
</Compile>
<Compile Include="..\ICSharpCode.SharpDevelop.BuildWorker\Program.cs">
<Link>Program.cs</Link>
</Compile>
<Compile Include="MSBuild35.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project>

46
src/Main/ICSharpCode.SharpDevelop.BuildWorker35/MSBuild35.cs

@ -0,0 +1,46 @@ @@ -0,0 +1,46 @@
// <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.BuildEngine;
using Microsoft.Build.Framework;
namespace ICSharpCode.SharpDevelop.BuildWorker
{
sealed class MSBuildWrapper
{
public void Cancel()
{
}
readonly Engine engine;
public MSBuildWrapper()
{
engine = new Engine(ToolsetDefinitionLocations.Registry | ToolsetDefinitionLocations.ConfigurationFile);
}
public bool DoBuild(BuildJob job, ILogger logger)
{
engine.RegisterLogger(logger);
Program.Log("Building target '" + job.Target + "' in " + job.ProjectFileName);
string[] targets = job.Target.Split(';');
BuildPropertyGroup globalProperties = new BuildPropertyGroup();
foreach (var pair in job.Properties) {
globalProperties.SetProperty(pair.Key, pair.Value, true);
}
try {
return engine.BuildProjectFile(job.ProjectFileName, targets, globalProperties);
} finally {
engine.UnregisterAllLoggers();
}
}
}
}

17
src/Main/ICSharpCode.SharpDevelop.BuildWorker35/Properties/AssemblyInfo.cs

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

15
src/Main/ICSharpCode.SharpDevelop.BuildWorker35/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>

12
src/Setup/Files.wxs

@ -450,6 +450,18 @@ @@ -450,6 +450,18 @@
<Component Guid="84FB3C82-23BD-11DE-8F18-C06F55D89593" Id="ICSharpCodeTreeViewDll" DiskId="1">
<File Source="..\..\bin\ICSharpCode.TreeView.dll" Name="ICSharpCode.TreeView.dll" Id="ICSharpCode.TreeView.dll" KeyPath="yes" />
</Component>
<Component Id="ICSharpCodeSharpDevelopBuildWorker35Exe" Guid="5065CD28-3B76-4AB9-B334-1DC1A91AA172" DiskId="1">
<File Id="ICSharpCode.SharpDevelop.BuildWorker35.exe" Name="ICSharpCode.SharpDevelop.BuildWorker35.exe" Source="..\..\bin\ICSharpCode.SharpDevelop.BuildWorker35.exe" KeyPath="yes" Assembly=".net" AssemblyApplication="ICSharpCode.SharpDevelop.BuildWorker35.exe" AssemblyManifest="ICSharpCode.SharpDevelop.BuildWorker35.exe">
<netfx:NativeImage Id="BuildWorker35NGenImage" Priority="1" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension" />
</File>
<File Id="ICSharpCode.SharpDevelop.BuildWorker35.exe.config" Name="ICSharpCode.SharpDevelop.BuildWorker35.exe.config" Source="..\..\bin\ICSharpCode.SharpDevelop.BuildWorker35.exe.config" />
</Component>
<Component Id="ICSharpCodeSharpDevelopBuildWorker40Exe" Guid="25731457-7DB4-40F6-8AA9-21AF7F9C04DD" DiskId="1">
<File Id="ICSharpCode.SharpDevelop.BuildWorker40.exe" Name="ICSharpCode.SharpDevelop.BuildWorker40.exe" Source="..\..\bin\ICSharpCode.SharpDevelop.BuildWorker40.exe" KeyPath="yes" Assembly=".net" AssemblyApplication="ICSharpCode.SharpDevelop.BuildWorker40.exe" AssemblyManifest="ICSharpCode.SharpDevelop.BuildWorker40.exe">
<netfx:NativeImage Id="BuildWorker40NGenImage" Priority="1" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension" />
</File>
<File Id="ICSharpCode.SharpDevelop.BuildWorker40.exe.config" Name="ICSharpCode.SharpDevelop.BuildWorker40.exe.config" Source="..\..\bin\ICSharpCode.SharpDevelop.BuildWorker40.exe.config" />
</Component>
</Directory>
<Directory Id="DocFolder" Name="doc">
<Component Guid="9DCED5AC-B771-4A4F-B4FE-69867BF2EBDE" Id="SharpDevelopDocFiles" DiskId="1">

2
src/Setup/Setup.wxs

@ -179,6 +179,8 @@ @@ -179,6 +179,8 @@
<ComponentRef Id="ICSharpCodeTextEditorDll"/>
<ComponentRef Id="ICSharpCodeAvalonEditDll"/>
<ComponentRef Id="ICSharpCodeTreeViewDll"/>
<ComponentRef Id="ICSharpCodeSharpDevelopBuildWorker35Exe"/>
<ComponentRef Id="ICSharpCodeSharpDevelopBuildWorker40Exe"/>
<ComponentRef Id="AgaControlsDll"/>
<ComponentRef Id="log4netDll"/>
<ComponentRef Id="MonoCecilDll"/>

Loading…
Cancel
Save