Browse Source

finished implementation of Behaviors

pull/18/head
Siegfried Pammer 14 years ago
parent
commit
80160c1c19
  1. 2
      SharpDevelop.sln
  2. 16
      src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj
  3. 2
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ProcessMonitor.cs
  4. 18
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ViewInBrowser.cs
  5. 276
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebBehavior.cs
  6. 2
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptions.cs
  7. 2
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml
  8. 23
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs
  9. 34
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooProject.cs
  10. 34
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs
  11. 61
      src/AddIns/BackendBindings/CppBinding/CppBinding/Project/CppProject.cs
  12. 40
      src/AddIns/BackendBindings/FSharpBinding/FSharpProject.cs
  13. 42
      src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonProject.cs
  14. 42
      src/AddIns/BackendBindings/Ruby/RubyBinding/Project/Src/RubyProject.cs
  15. 34
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs
  16. 149
      src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixProject.cs
  17. 2
      src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.csproj
  18. 277
      src/AddIns/Debugger/Debugger.AddIn/Service/WindowsDebugger.cs
  19. 13
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  20. 4
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/DebugOptions.xaml
  21. 123
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/aaDebugOptions.cs
  22. 58
      src/Main/Base/Project/Src/Project/AbstractProject.cs
  23. 125
      src/Main/Base/Project/Src/Project/Behaviors/DefaultProjectBehavior.cs
  24. 363
      src/Main/Base/Project/Src/Project/Behaviors/DotNetStartBehavior.cs
  25. 99
      src/Main/Base/Project/Src/Project/Behaviors/ProjectBehavior.cs
  26. 341
      src/Main/Base/Project/Src/Project/CompilableProject.cs
  27. 4
      src/Main/Base/Project/Src/Project/Converter/IUpgradableProject.cs
  28. 59
      src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs
  29. 6
      src/Main/Base/Project/Src/Services/Debugger/DefaultDebugger.cs
  30. 4
      src/Main/Base/Project/Src/Services/Debugger/IDebugger.cs

2
SharpDevelop.sln

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
# SharpDevelop 4.2.0.8267-alpha
# SharpDevelop 4.2.0.8507-beta
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Main", "Main", "{256F5C28-532C-44C0-8AB8-D8EC5E492E01}"
ProjectSection(SolutionItems) = postProject
EndProjectSection

16
src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj

@ -36,10 +36,12 @@ @@ -36,10 +36,12 @@
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="System" />
<Reference Include="System.Management" />
<Reference Include="System.Web.Razor">
<HintPath>..\Libraries\System.Web.Razor.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Web.Services" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
@ -212,12 +214,19 @@ @@ -212,12 +214,19 @@
<Compile Include="Src\MvcViewTextTemplateFileName.cs" />
<Compile Include="Src\MvcViewTypeViewModel.cs" />
<Compile Include="Src\MvcVirtualPath.cs" />
<Compile Include="Src\ProcessMonitor.cs" />
<Compile Include="Src\SelectedFolderNodeInProjectsView.cs" />
<Compile Include="Src\SelectedMvcControllerFolder.cs" />
<Compile Include="Src\SelectedMvcFolder.cs" />
<Compile Include="Src\SelectedMvcViewFolder.cs" />
<Compile Include="Src\SlideBehaviour.cs" />
<Compile Include="Src\ViewInBrowser.cs" />
<Compile Include="Src\ViewModelBase.cs" />
<Compile Include="Src\WebBehavior.cs" />
<Compile Include="Src\WebProjectOptions\WebProjectOptions.cs" />
<Compile Include="Src\WebProjectOptions\WebProjectOptionsPanel.xaml.cs">
<DependentUpon>WebProjectOptionsPanel.xaml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<Folder Include="ItemTemplates" />
@ -235,6 +244,7 @@ @@ -235,6 +244,7 @@
<Folder Include="ItemTemplates\VisualBasic\CodeTemplates\AddView\VBHTML" />
<Folder Include="Resources" />
<Folder Include="Src\Folding" />
<Folder Include="Src\WebProjectOptions" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj">
@ -262,6 +272,11 @@ @@ -262,6 +272,11 @@
<Name>ICSharpCode.SharpDevelop.Dom</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj">
<Project>{8035765F-D51F-4A0C-A746-2FD100E19419}</Project>
<Name>ICSharpCode.SharpDevelop.Widgets</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\DisplayBindings\AvalonEdit.AddIn\AvalonEdit.AddIn.csproj">
<Project>{0162E499-42D0-409B-AA25-EED21F75336B}</Project>
<Name>AvalonEdit.AddIn</Name>
@ -398,6 +413,7 @@ @@ -398,6 +413,7 @@
<ItemGroup>
<Page Include="Src\AddMvcControllerToProjectView.xaml" />
<Page Include="Src\AddMvcViewToProjectView.xaml" />
<Page Include="Src\WebProjectOptions\WebProjectOptionsPanel.xaml" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
<Import Project="PostBuildEvent.proj" />

2
src/AddIns/Debugger/Debugger.AddIn/Service/ProcessMonitor.cs → src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ProcessMonitor.cs

@ -8,7 +8,7 @@ using System.Diagnostics; @@ -8,7 +8,7 @@ using System.Diagnostics;
using System.Globalization;
using System.Management;
namespace ICSharpCode.SharpDevelop.Services
namespace ICSharpCode.AspNet.Mvc
{
public class ProcessMonitor : ManagementEventWatcher, IDisposable
{

18
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SpecialFileNodeCommands.cs → src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/ViewInBrowser.cs

@ -7,8 +7,10 @@ using System.Linq; @@ -7,8 +7,10 @@ using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui.OptionPanels;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Project.Commands;
namespace ICSharpCode.SharpDevelop.Project.Commands
namespace ICSharpCode.AspNet.Mvc
{
public class ViewInBrowser : AbstractMenuCommand
{
@ -36,27 +38,27 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -36,27 +38,27 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
string fileName = node.FileName;
// set project options
project.StartAction = StartAction.StartURL;
string directoryName = Path.GetDirectoryName(project.FileName) + "\\";
project.StartUrl = fileName.Replace(directoryName, "/").Replace("\\", "/");
// // set project options
// project.StartAction = StartAction.StartURL;
// string directoryName = Path.GetDirectoryName(project.FileName) + "\\";
// project.StartUrl = fileName.Replace(directoryName, "/").Replace("\\", "/");
// set web server options
string projectName = project.Name;
WebProjectOptions existingOptions = WebProjectsOptions.Instance.GetWebProjectOptions(projectName);
var options = new WebProjectOptions {
Data = new WebProjectDebugData {
WebServer = WebProjectService.IsIISExpressInstalled ? WebServer.IISExpress : WebServer.IIS,
Port = (existingOptions != null && existingOptions.Data != null) ? existingOptions.Data.Port : "8080", //TODO: port collision detection
ProjectUrl = string.Format("{0}/{1}", CompilableProject.LocalHost, project.Name)
ProjectUrl = string.Format("{0}/{1}", WebBehavior.LocalHost, project.Name)
},
ProjectName = projectName
};
if (options.Data.WebServer == WebServer.IISExpress) {
options.Data.ProjectUrl = string.Format(
@"{0}:{1}/{2}", CompilableProject.LocalHost, options.Data.Port, projectName);
@"{0}:{1}/{2}", WebBehavior.LocalHost, options.Data.Port, projectName);
}
WebProjectsOptions.Instance.SetWebProjectOptions(projectName, options);

276
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebBehavior.cs

@ -0,0 +1,276 @@ @@ -0,0 +1,276 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Diagnostics;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.AspNet.Mvc
{
public class WebBehavior : ProjectBehavior
{
ProcessMonitor monitor;
public WebBehavior(MSBuildBasedProject project, ProjectBehavior next = null)
: base(project, next)
{
}
new MSBuildBasedProject Project {
get {
return (MSBuildBasedProject)base.Project;
}
}
public string StartProgram {
get {
return ((MSBuildBasedProject)Project).GetEvaluatedProperty("StartProgram") ?? "";
}
set {
((MSBuildBasedProject)Project).SetProperty("StartProgram", string.IsNullOrEmpty(value) ? null : value);
}
}
public string StartUrl {
get {
return ((MSBuildBasedProject)Project).GetEvaluatedProperty("StartURL") ?? "";
}
set {
((MSBuildBasedProject)Project).SetProperty("StartURL", string.IsNullOrEmpty(value) ? null : value);
}
}
public const string LocalHost = "http://localhost";
public override bool IsStartable {
get { return true; }
}
public override ProcessStartInfo CreateStartInfo()
{
return new ProcessStartInfo(LocalHost);
}
// TODO horrible CODE DUPLICATION
public override void Start(bool withDebugging)
{
var processStartInfo = CreateStartInfo();
if (FileUtility.IsUrl(processStartInfo.FileName)) {
if (!CheckWebProjectStartInfo())
return;
// we deal with a WebProject
try {
var project = ProjectService.OpenSolution.StartupProject as CompilableProject;
WebProjectOptions options = WebProjectsOptions.Instance.GetWebProjectOptions(project.Name);
System.Diagnostics.Process defaultAppProcess = null;
string processName = WebProjectService.GetWorkerProcessName(options.Data.WebServer);
// try find the worker process directly or using the process monitor callback
var processes = System.Diagnostics.Process.GetProcesses();
int index = processes.FindIndex(p => p.ProcessName.Equals(processName, StringComparison.OrdinalIgnoreCase));
if (index > -1){
DebuggerService.CurrentDebugger.Attach(processes[index]);
} else {
this.monitor = new ProcessMonitor(processName);
this.monitor.ProcessCreated += delegate {
WorkbenchSingleton.SafeThreadCall((Action)(() => OnProcessCreated(defaultAppProcess, options)));
};
this.monitor.Start();
if (options.Data.WebServer == WebServer.IISExpress) {
// start IIS express and attach to it
if (WebProjectService.IsIISExpressInstalled) {
System.Diagnostics.Process.Start(WebProjectService.IISExpressProcessLocation);
} else {
DisposeProcessMonitor();
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return;
}
}
}
// start default application(e.g. browser) or the one specified
switch (project.StartAction) {
case StartAction.Project:
if (FileUtility.IsUrl(options.Data.ProjectUrl)) {
defaultAppProcess = System.Diagnostics.Process.Start(options.Data.ProjectUrl);
} else {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
DisposeProcessMonitor();
return;
}
break;
case StartAction.Program:
defaultAppProcess = System.Diagnostics.Process.Start(StartProgram);
break;
case StartAction.StartURL:
if (FileUtility.IsUrl(StartUrl))
defaultAppProcess = System.Diagnostics.Process.Start(StartUrl);
else {
string url = string.Concat(options.Data.ProjectUrl, StartUrl);
if (FileUtility.IsUrl(url)) {
defaultAppProcess = System.Diagnostics.Process.Start(url);
} else {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
DisposeProcessMonitor();
return;
}
}
break;
default:
throw new System.Exception("Invalid value for StartAction");
}
} catch (System.Exception ex) {
string err = "Error: " + ex.Message;
MessageService.ShowError(err);
LoggingService.Error(err);
DisposeProcessMonitor();
return;
}
}
}
void WithoutDebugger()
{
var processStartInfo = CreateStartInfo();
if (FileUtility.IsUrl(processStartInfo.FileName)) {
if (!CheckWebProjectStartInfo())
return;
// we deal with a WebProject
try {
var project = ProjectService.OpenSolution.StartupProject as CompilableProject;
WebProjectOptions options = WebProjectsOptions.Instance.GetWebProjectOptions(project.Name);
string processName = WebProjectService.GetWorkerProcessName(options.Data.WebServer);
if (options.Data.WebServer == WebServer.IISExpress) {
// start IIS express
if (WebProjectService.IsIISExpressInstalled)
System.Diagnostics.Process.Start(WebProjectService.IISExpressProcessLocation);
else {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return;
}
}
// start default application(e.g. browser) or the one specified
switch (project.StartAction) {
case StartAction.Project:
if (FileUtility.IsUrl(options.Data.ProjectUrl)) {
System.Diagnostics.Process.Start(options.Data.ProjectUrl);
} else {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return;
}
break;
case StartAction.Program:
System.Diagnostics.Process.Start(StartProgram);
break;
case StartAction.StartURL:
if (FileUtility.IsUrl(StartUrl))
System.Diagnostics.Process.Start(StartUrl);
else {
string url = string.Concat(options.Data.ProjectUrl, StartUrl);
if (FileUtility.IsUrl(url)) {
System.Diagnostics.Process.Start(url);
} else {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return;
}
}
break;
default:
throw new System.Exception("Invalid value for StartAction");
}
} catch (System.Exception ex) {
string err = "Error: " + ex.Message;
MessageService.ShowError(err);
LoggingService.Error(err);
return;
}
}
}
bool CheckWebProjectStartInfo()
{
// check if we have startup project
var project = ProjectService.OpenSolution.StartupProject as CompilableProject;
if (project == null) {
MessageService.ShowError("${res:ICSharpCode.NoStartupProject}");
return false;
}
// check if we have options
if (WebProjectsOptions.Instance == null) {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return false;
}
// check the options
var options = WebProjectsOptions.Instance.GetWebProjectOptions(project.Name);
if (options == null || options.Data == null || string.IsNullOrEmpty(options.ProjectName) ||
options.Data.WebServer == WebServer.None) {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return false;
}
return true;
}
void OnProcessCreated(System.Diagnostics.Process defaultAppProcess, WebProjectOptions options)
{
string processName = WebProjectService.GetWorkerProcessName(options.Data.WebServer);
var processes = System.Diagnostics.Process.GetProcesses();
int index = processes.FindIndex(p => p.ProcessName.Equals(processName, StringComparison.OrdinalIgnoreCase));
if (index == -1)
return;
DebuggerService.CurrentDebugger.Attach(processes[index]);
if (!DebuggerService.CurrentDebugger.IsAttached) {
if(options.Data.WebServer == WebServer.IIS) {
string format = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.NoIISWP");
MessageService.ShowMessage(string.Format(format, processName));
} else {
DebuggerService.CurrentDebugger.Attach(defaultAppProcess);
if (!DebuggerService.CurrentDebugger.IsAttached) {
MessageService.ShowMessage(ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.UnableToAttach"));
}
}
}
}
void DisposeProcessMonitor()
{
if (monitor != null) {
monitor.Stop();
monitor.Dispose();
monitor = null;
}
}
public override ICSharpCode.Core.Properties CreateMemento()
{
var properties = base.CreateMemento();
// web project properties
var webOptions = WebProjectsOptions.Instance.GetWebProjectOptions(Project.Name);
if (webOptions != null)
properties.Set("WebProjectOptions", webOptions);
return properties;
}
public override void SetMemento(ICSharpCode.Core.Properties memento)
{
// web project properties
WebProjectsOptions.Instance.SetWebProjectOptions(Project.Name, memento.Get("WebProjectOptions", new WebProjectOptions()) as WebProjectOptions);
base.SetMemento(memento);
}
}
}

2
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/WebProjectOptions/WebProjectOptions.cs → src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptions.cs

@ -8,7 +8,7 @@ using System.ComponentModel; @@ -8,7 +8,7 @@ using System.ComponentModel;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
namespace ICSharpCode.AspNet.Mvc
{
public sealed class WebProjectsOptions
{

2
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/WebProjectOptions/WebProjectOptionsPanel.xaml → src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<UserControl
x:Class="ICSharpCode.SharpDevelop.Gui.OptionPanels.WebProjectOptionsPanel"
x:Class="ICSharpCode.AspNet.Mvc.WebProjectOptionsPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:core="http://icsharpcode.net/sharpdevelop/core"
xmlns:widgets="http://icsharpcode.net/sharpdevelop/widgets"

23
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/WebProjectOptions/WebProjectOptionsPanel.xaml.cs → src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs

@ -6,33 +6,18 @@ using System.IO; @@ -6,33 +6,18 @@ using System.IO;
using System.Web.Services.Description;
using System.Windows;
using System.Windows.Controls;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
namespace ICSharpCode.AspNet.Mvc
{
public partial class WebProjectOptionsPanel : UserControl
{
private readonly aaDebugOptions parentPanel;
public WebProjectOptionsPanel()
{
InitializeComponent();
// this.parentPanel = parentPanel;
if (CurrentProjectDebugData == null)
CurrentProjectDebugData = new WebProjectDebugData();
Loaded += OnLoaded;
}
public WebProjectOptionsPanel(aaDebugOptions parentPanel):this()
{
// InitializeComponent();
this.parentPanel = parentPanel;
if (CurrentProjectDebugData == null)
CurrentProjectDebugData = new WebProjectDebugData();
@ -154,7 +139,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -154,7 +139,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
UseLocalIIS.IsChecked = false;
} else {
StatusLabel.Text = string.Empty;
ProjectUrl.Text = string.Format("{0}/{1}", CompilableProject.LocalHost, ProjectService.CurrentProject.Name);
ProjectUrl.Text = string.Format("{0}/{1}", WebBehavior.LocalHost, ProjectService.CurrentProject.Name);
}
data.ProjectUrl = ProjectUrl.Text;
@ -208,7 +193,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -208,7 +193,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
WebProjectDebugData data = new WebProjectDebugData();
data.WebServer = WebServer.IISExpress;
data.Port = PortTextBox.Text;
data.ProjectUrl = string.Format(@"{0}:{1}/{2}", CompilableProject.LocalHost, PortTextBox.Text, ProjectService.CurrentProject.Name);
data.ProjectUrl = string.Format(@"{0}:{1}/{2}", WebBehavior.LocalHost, PortTextBox.Text, ProjectService.CurrentProject.Name);
CurrentProjectDebugData = data;
}
}

34
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooProject.cs

@ -74,14 +74,6 @@ namespace Grunwald.BooBinding @@ -74,14 +74,6 @@ namespace Grunwald.BooBinding
((IProjectItemListProvider)this).AddProjectItem(new ReferenceProjectItem(this, assembly));
}
public override ItemType GetDefaultItemType(string fileName)
{
if (string.Equals(Path.GetExtension(fileName), ".boo", StringComparison.OrdinalIgnoreCase))
return ItemType.Compile;
else
return base.GetDefaultItemType(fileName);
}
internal static IProjectContent BooCompilerPC;
protected override ParseProjectContent CreateProjectContent()
@ -138,5 +130,31 @@ namespace Grunwald.BooBinding @@ -138,5 +130,31 @@ namespace Grunwald.BooBinding
return false;
}
}
protected override ProjectBehavior GetOrCreateBehavior()
{
if (projectBehavior != null)
return projectBehavior;
BooProjectBehavior behavior = new BooProjectBehavior(this, new DotNetStartBehavior(this, new DefaultProjectBehavior(this)));
projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, behavior);
return projectBehavior;
}
}
public class BooProjectBehavior : ProjectBehavior
{
public BooProjectBehavior(BooProject project, ProjectBehavior next = null)
: base(project, next)
{
}
public override ItemType GetDefaultItemType(string fileName)
{
if (string.Equals(Path.GetExtension(fileName), ".boo", StringComparison.OrdinalIgnoreCase))
return ItemType.Compile;
else
return base.GetDefaultItemType(fileName);
}
}
}

34
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs

@ -67,14 +67,6 @@ namespace CSharpBinding @@ -67,14 +67,6 @@ namespace CSharpBinding
PropertyStorageLocations.ConfigurationSpecific, false);
}
public override ItemType GetDefaultItemType(string fileName)
{
if (string.Equals(Path.GetExtension(fileName), ".cs", StringComparison.OrdinalIgnoreCase))
return ItemType.Compile;
else
return base.GetDefaultItemType(fileName);
}
public override void StartBuild(ProjectBuildOptions options, IBuildFeedbackSink feedbackSink)
{
if (this.MinimumSolutionVersion == Solution.SolutionVersionVS2005) {
@ -149,5 +141,31 @@ namespace CSharpBinding @@ -149,5 +141,31 @@ namespace CSharpBinding
}
}
*/
protected override ProjectBehavior GetOrCreateBehavior()
{
if (projectBehavior != null)
return projectBehavior;
CSharpProjectBehavior behavior = new CSharpProjectBehavior(this, new DotNetStartBehavior(this, new DefaultProjectBehavior(this)));
projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, behavior);
return projectBehavior;
}
}
public class CSharpProjectBehavior : ProjectBehavior
{
public CSharpProjectBehavior(CSharpProject project, ProjectBehavior next = null)
: base(project, next)
{
}
public override ItemType GetDefaultItemType(string fileName)
{
if (string.Equals(Path.GetExtension(fileName), ".cs", StringComparison.OrdinalIgnoreCase))
return ItemType.Compile;
else
return base.GetDefaultItemType(fileName);
}
}
}

61
src/AddIns/BackendBindings/CppBinding/CppBinding/Project/CppProject.cs

@ -36,13 +36,6 @@ namespace ICSharpCode.CppBinding.Project @@ -36,13 +36,6 @@ namespace ICSharpCode.CppBinding.Project
{
}
public override ProjectItem CreateProjectItem(IProjectItemBackendStore item)
{
if ("ProjectConfiguration" == item.ItemType.ItemName)
return new ProjectConfigurationProjectItem(this, item);
return base.CreateProjectItem(item);
}
public override IAmbience GetAmbience()
{
return new CppAmbience();
@ -85,21 +78,6 @@ namespace ICSharpCode.CppBinding.Project @@ -85,21 +78,6 @@ namespace ICSharpCode.CppBinding.Project
}
}
public override ItemType GetDefaultItemType(string fileName)
{
const string RESOURCE_COMPILE = "ResourceCompile";
string extension = Path.GetExtension(fileName).ToLower();
switch (extension)
{
case ".cpp": return ItemType.ClCompile;
case ".c": return ItemType.ClCompile;
case ".hpp": return ItemType.ClInclude;
case ".h": return ItemType.ClInclude;
case ".rc": return new ItemType(RESOURCE_COMPILE);
}
return base.GetDefaultItemType(fileName);
}
public const string DefaultTargetsFile = @"$(VCTargetsPath)\Microsoft.Cpp.Targets";
public const string DefaultPropsFile = @"$(VCTargetsPath)\Microsoft.Cpp.Default.props";
@ -201,5 +179,44 @@ namespace ICSharpCode.CppBinding.Project @@ -201,5 +179,44 @@ namespace ICSharpCode.CppBinding.Project
prjConfiguration.AddMetadata("Platform", GetPlatformNameFromKey(target));
}
}
protected override ProjectBehavior GetOrCreateBehavior()
{
if (projectBehavior != null)
return projectBehavior;
CppProjectBehavior behavior = new CppProjectBehavior(this, new DotNetStartBehavior(this, new DefaultProjectBehavior(this)));
projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, behavior);
return projectBehavior; }
}
public class CppProjectBehavior : ProjectBehavior
{
public CppProjectBehavior(CppProject project, ProjectBehavior next = null)
: base(project, next)
{
}
public override ProjectItem CreateProjectItem(IProjectItemBackendStore item)
{
if ("ProjectConfiguration" == item.ItemType.ItemName)
return new ProjectConfigurationProjectItem(Project, item);
return base.CreateProjectItem(item);
}
public override ItemType GetDefaultItemType(string fileName)
{
const string RESOURCE_COMPILE = "ResourceCompile";
string extension = Path.GetExtension(fileName).ToLower();
switch (extension)
{
case ".cpp": return ItemType.ClCompile;
case ".c": return ItemType.ClCompile;
case ".hpp": return ItemType.ClInclude;
case ".h": return ItemType.ClInclude;
case ".rc": return new ItemType(RESOURCE_COMPILE);
}
return base.GetDefaultItemType(fileName);
}
}
}

40
src/AddIns/BackendBindings/FSharpBinding/FSharpProject.cs

@ -31,17 +31,6 @@ namespace FSharpBinding @@ -31,17 +31,6 @@ namespace FSharpBinding
}
}
public override ItemType GetDefaultItemType(string fileName)
{
if (string.Equals(".fs", Path.GetExtension(fileName), StringComparison.InvariantCultureIgnoreCase)) {
return ItemType.Compile;
} else if (string.Equals(".fsi", Path.GetExtension(fileName), StringComparison.InvariantCultureIgnoreCase)) {
return ItemType.Compile;
} else {
return base.GetDefaultItemType(fileName);
}
}
public override string Language {
get {
return "F#";
@ -53,5 +42,34 @@ namespace FSharpBinding @@ -53,5 +42,34 @@ namespace FSharpBinding
return LanguageProperties.None;
}
}
protected override ProjectBehavior GetOrCreateBehavior()
{
if (projectBehavior != null)
return projectBehavior;
FSharpProjectBehavior behavior = new FSharpProjectBehavior(this, new DotNetStartBehavior(this, new DefaultProjectBehavior(this)));
projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, behavior);
return projectBehavior;
}
}
public class FSharpProjectBehavior : ProjectBehavior
{
public FSharpProjectBehavior(FSharpProject project, ProjectBehavior next = null)
: base(project, next)
{
}
public override ItemType GetDefaultItemType(string fileName)
{
if (string.Equals(".fs", Path.GetExtension(fileName), StringComparison.InvariantCultureIgnoreCase)) {
return ItemType.Compile;
} else if (string.Equals(".fsi", Path.GetExtension(fileName), StringComparison.InvariantCultureIgnoreCase)) {
return ItemType.Compile;
} else {
return base.GetDefaultItemType(fileName);
}
}
}
}

42
src/AddIns/BackendBindings/Python/PythonBinding/Project/Src/PythonProject.cs

@ -41,6 +41,36 @@ namespace ICSharpCode.PythonBinding @@ -41,6 +41,36 @@ namespace ICSharpCode.PythonBinding
get { return PythonLanguageProperties.Default; }
}
public void AddMainFile(string fileName)
{
SetProperty(null, null, "MainFile", fileName, PropertyStorageLocations.Base, true);
}
/// <summary>
/// Returns true if a main file is already defined for this project.
/// </summary>
public bool HasMainFile {
get { return GetProperty(null, null, "MainFile") != null; }
}
protected override ProjectBehavior GetOrCreateBehavior()
{
if (projectBehavior != null)
return projectBehavior;
PythonProjectBehavior behavior = new PythonProjectBehavior(this, new DotNetStartBehavior(this, new DefaultProjectBehavior(this)));
projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, behavior);
return projectBehavior;
}
}
public class PythonProjectBehavior : ProjectBehavior
{
public PythonProjectBehavior(PythonProject project, ProjectBehavior next = null)
: base(project, next)
{
}
/// <summary>
/// Returns ItemType.Compile if the filename has a
/// python extension (.py).
@ -55,17 +85,5 @@ namespace ICSharpCode.PythonBinding @@ -55,17 +85,5 @@ namespace ICSharpCode.PythonBinding
}
return base.GetDefaultItemType(fileName);
}
public void AddMainFile(string fileName)
{
SetProperty(null, null, "MainFile", fileName, PropertyStorageLocations.Base, true);
}
/// <summary>
/// Returns true if a main file is already defined for this project.
/// </summary>
public bool HasMainFile {
get { return GetProperty(null, null, "MainFile") != null; }
}
}
}

42
src/AddIns/BackendBindings/Ruby/RubyBinding/Project/Src/RubyProject.cs

@ -37,6 +37,36 @@ namespace ICSharpCode.RubyBinding @@ -37,6 +37,36 @@ namespace ICSharpCode.RubyBinding
get { return RubyLanguageProperties.Default; }
}
public void AddMainFile(string fileName)
{
SetProperty(null, null, "MainFile", fileName, PropertyStorageLocations.Base, true);
}
/// <summary>
/// Returns true if a main file is already defined for this project.
/// </summary>
public bool HasMainFile {
get { return GetProperty(null, null, "MainFile") != null; }
}
protected override ProjectBehavior GetOrCreateBehavior()
{
if (projectBehavior != null)
return projectBehavior;
RubyProjectBehavior behavior = new RubyProjectBehavior(this, new DotNetStartBehavior(this, new DefaultProjectBehavior(this)));
projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, behavior);
return projectBehavior;
}
}
public class RubyProjectBehavior : ProjectBehavior
{
public RubyProjectBehavior(RubyProject project, ProjectBehavior next = null)
: base(project, next)
{
}
/// <summary>
/// Returns ItemType.Compile if the filename has a Ruby extension (.rb).
/// </summary>
@ -50,17 +80,5 @@ namespace ICSharpCode.RubyBinding @@ -50,17 +80,5 @@ namespace ICSharpCode.RubyBinding
}
return base.GetDefaultItemType(fileName);
}
public void AddMainFile(string fileName)
{
SetProperty(null, null, "MainFile", fileName, PropertyStorageLocations.Base, true);
}
/// <summary>
/// Returns true if a main file is already defined for this project.
/// </summary>
public bool HasMainFile {
get { return GetProperty(null, null, "MainFile") != null; }
}
}
}

34
src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs

@ -95,14 +95,6 @@ namespace ICSharpCode.VBNetBinding @@ -95,14 +95,6 @@ namespace ICSharpCode.VBNetBinding
get { return LanguageProperties.VBNet; }
}
public override ItemType GetDefaultItemType(string fileName)
{
if (string.Equals(Path.GetExtension(fileName), ".vb", StringComparison.OrdinalIgnoreCase))
return ItemType.Compile;
else
return base.GetDefaultItemType(fileName);
}
public override void StartBuild(ProjectBuildOptions options, IBuildFeedbackSink feedbackSink)
{
if (this.MinimumSolutionVersion == Solution.SolutionVersionVS2005) {
@ -192,5 +184,31 @@ namespace ICSharpCode.VBNetBinding @@ -192,5 +184,31 @@ namespace ICSharpCode.VBNetBinding
return "On".Equals(val, StringComparison.OrdinalIgnoreCase);
}
protected override ProjectBehavior GetOrCreateBehavior()
{
if (projectBehavior != null)
return projectBehavior;
VBProjectBehavior behavior = new VBProjectBehavior(this, new DotNetStartBehavior(this, new DefaultProjectBehavior(this)));
projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, behavior);
return projectBehavior;
}
}
public class VBProjectBehavior : ProjectBehavior
{
public VBProjectBehavior(VBNetProject project, ProjectBehavior next = null)
: base(project, next)
{
}
public override ItemType GetDefaultItemType(string fileName)
{
if (string.Equals(Path.GetExtension(fileName), ".vb", StringComparison.OrdinalIgnoreCase))
return ItemType.Compile;
else
return base.GetDefaultItemType(fileName);
}
}
}

149
src/AddIns/BackendBindings/WixBinding/Project/Src/Project/WixProject.cs

@ -56,21 +56,6 @@ namespace ICSharpCode.WixBinding @@ -56,21 +56,6 @@ namespace ICSharpCode.WixBinding
get { return LanguageProperties.None; }
}
public override void Start(bool withDebugging)
{
base.Start(false); // debugging not supported
}
public override ProcessStartInfo CreateStartInfo()
{
switch (StartAction) {
case StartAction.Project:
return CreateStartInfo(GetInstallerFullPath());
default:
return base.CreateStartInfo();
}
}
/// <summary>
/// Returns the filename extension based on the project's output type.
/// </summary>
@ -89,21 +74,6 @@ namespace ICSharpCode.WixBinding @@ -89,21 +74,6 @@ namespace ICSharpCode.WixBinding
}
}
/// <summary>
/// Adds the ability to creates Wix Library and Wix Object project items.
/// </summary>
public override ProjectItem CreateProjectItem(IProjectItemBackendStore item)
{
switch (item.ItemType.ItemName) {
case WixItemType.LibraryName:
return new WixLibraryProjectItem(this, item);
case WixItemType.ExtensionName:
return new WixExtensionProjectItem(this, item);
default:
return base.CreateProjectItem(item);
}
}
/// <summary>
/// Gets the full path to the installer file that will be generated by
/// the Wix compiler and linker.
@ -125,7 +95,7 @@ namespace ICSharpCode.WixBinding @@ -125,7 +95,7 @@ namespace ICSharpCode.WixBinding
public override string OutputAssemblyFullPath {
get { return GetInstallerFullPath(); }
}
/// <summary>
/// Adds a set of Wix libraries (.wixlib) to the project.
/// </summary>
@ -204,22 +174,6 @@ namespace ICSharpCode.WixBinding @@ -204,22 +174,6 @@ namespace ICSharpCode.WixBinding
return null;
}
/// <summary>
/// Checks whether the specified file can be compiled by the
/// Wix project.
/// </summary>
/// <returns>
/// <c>Compile</c> if the file is a WiX source file (.wxs)
/// or a WiX include file (.wxi), otherwise the default implementation
/// in MSBuildBasedProject is called.</returns>
public override ItemType GetDefaultItemType(string fileName)
{
if (WixFileName.IsWixFileName(fileName)) {
return ItemType.Compile;
}
return base.GetDefaultItemType(fileName);
}
/// <summary>
/// AssemblyName must be implemented correctly - used when renaming projects.
/// </summary>
@ -261,5 +215,106 @@ namespace ICSharpCode.WixBinding @@ -261,5 +215,106 @@ namespace ICSharpCode.WixBinding
}
return new ReadOnlyCollection<WixExtensionProjectItem>(items);
}
protected override ProjectBehavior GetOrCreateBehavior()
{
if (projectBehavior != null)
return projectBehavior;
WixStartBehavior behavior = new WixStartBehavior(this, new DotNetStartBehavior(this, new DefaultProjectBehavior(this)));
projectBehavior = ProjectBehaviorService.LoadBehaviorsForProject(this, behavior);
return projectBehavior;
}
}
public class WixStartBehavior : ProjectBehavior
{
public WixStartBehavior(WixProject project, ProjectBehavior next = null)
: base(project, next)
{
}
new WixProject Project {
get {
return (WixProject)base.Project;
}
}
public string StartArguments {
get {
return Project.GetEvaluatedProperty("StartArguments") ?? "";
}
set {
Project.SetProperty("StartArguments", string.IsNullOrEmpty(value) ? null : value);
}
}
public string StartWorkingDirectory {
get {
return Project.GetEvaluatedProperty("StartWorkingDirectory") ?? "";
}
set {
Project.SetProperty("StartWorkingDirectory", string.IsNullOrEmpty(value) ? null : value);
}
}
public StartAction StartAction {
get {
try {
return (StartAction)Enum.Parse(typeof(StartAction), Project.GetEvaluatedProperty("StartAction") ?? "Project");
} catch (ArgumentException) {
return StartAction.Project;
}
}
set {
Project.SetProperty("StartAction", value.ToString());
}
}
public override void Start(bool withDebugging)
{
base.Start(false); // debugging not supported
}
public override ProcessStartInfo CreateStartInfo()
{
switch (StartAction) {
case StartAction.Project:
return DotNetStartBehavior.CreateStartInfo(Project.GetInstallerFullPath(), Project.Directory, StartWorkingDirectory, StartArguments);
default:
return base.CreateStartInfo();
}
}
/// <summary>
/// Adds the ability to creates Wix Library and Wix Object project items.
/// </summary>
public override ProjectItem CreateProjectItem(IProjectItemBackendStore item)
{
switch (item.ItemType.ItemName) {
case WixItemType.LibraryName:
return new WixLibraryProjectItem(Project, item);
case WixItemType.ExtensionName:
return new WixExtensionProjectItem(Project, item);
default:
return base.CreateProjectItem(item);
}
}
/// <summary>
/// Checks whether the specified file can be compiled by the
/// Wix project.
/// </summary>
/// <returns>
/// <c>Compile</c> if the file is a WiX source file (.wxs)
/// or a WiX include file (.wxi), otherwise the default implementation
/// in MSBuildBasedProject is called.</returns>
public override ItemType GetDefaultItemType(string fileName)
{
if (WixFileName.IsWixFileName(fileName)) {
return ItemType.Compile;
}
return base.GetDefaultItemType(fileName);
}
}
}

2
src/AddIns/Debugger/Debugger.AddIn/Debugger.AddIn.csproj

@ -86,7 +86,6 @@ @@ -86,7 +86,6 @@
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Management" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="System.Xaml" />
@ -185,7 +184,6 @@ @@ -185,7 +184,6 @@
<DependentUpon>EditBreakpointScriptWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Service\ProcessMonitor.cs" />
<Compile Include="Tooltips\DebuggerPopup.cs" />
<Compile Include="Tooltips\DebuggerTooltipControl.xaml.cs">
<DependentUpon>DebuggerTooltipControl.xaml</DependentUpon>

277
src/AddIns/Debugger/Debugger.AddIn/Service/WindowsDebugger.cs

@ -47,7 +47,6 @@ namespace ICSharpCode.SharpDevelop.Services @@ -47,7 +47,6 @@ namespace ICSharpCode.SharpDevelop.Services
ICorPublish corPublish;
Process debuggedProcess;
ProcessMonitor monitor;
internal IDebuggerDecompilerService debuggerDecompilerService;
@ -144,125 +143,50 @@ namespace ICSharpCode.SharpDevelop.Services @@ -144,125 +143,50 @@ namespace ICSharpCode.SharpDevelop.Services
InitializeService();
}
if (FileUtility.IsUrl(processStartInfo.FileName)) {
if (!CheckWebProjectStartInfo())
return;
// we deal with a WebProject
try {
var project = ProjectService.OpenSolution.StartupProject as CompilableProject;
WebProjectOptions options = WebProjectsOptions.Instance.GetWebProjectOptions(project.Name);
System.Diagnostics.Process defaultAppProcess = null;
string processName = WebProjectService.GetWorkerProcessName(options.Data.WebServer);
// try find the worker process directly or using the process monitor callback
var processes = System.Diagnostics.Process.GetProcesses();
int index = processes.FindIndex(p => p.ProcessName.Equals(processName, StringComparison.OrdinalIgnoreCase));
if (index > -1){
Attach(processes[index]);
} else {
this.monitor = new ProcessMonitor(processName);
this.monitor.ProcessCreated += delegate {
WorkbenchSingleton.SafeThreadCall((Action)(() => OnProcessCreated(defaultAppProcess, options)));
};
this.monitor.Start();
if (options.Data.WebServer == WebServer.IISExpress) {
// start IIS express and attach to it
if (WebProjectService.IsIISExpressInstalled) {
System.Diagnostics.Process.Start(WebProjectService.IISExpressProcessLocation);
} else {
DisposeProcessMonitor();
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return;
}
}
}
// start default application(e.g. browser) or the one specified
switch (project.StartAction) {
case StartAction.Project:
if (FileUtility.IsUrl(options.Data.ProjectUrl)) {
defaultAppProcess = System.Diagnostics.Process.Start(options.Data.ProjectUrl);
} else {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
DisposeProcessMonitor();
return;
}
break;
case StartAction.Program:
defaultAppProcess = System.Diagnostics.Process.Start(project.StartProgram);
break;
case StartAction.StartURL:
if (FileUtility.IsUrl(project.StartUrl))
defaultAppProcess = System.Diagnostics.Process.Start(project.StartUrl);
else {
string url = string.Concat(options.Data.ProjectUrl, project.StartUrl);
if (FileUtility.IsUrl(url)) {
defaultAppProcess = System.Diagnostics.Process.Start(url);
} else {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
DisposeProcessMonitor();
return;
}
}
break;
default:
throw new System.Exception("Invalid value for StartAction");
}
} catch (System.Exception ex) {
string err = "Error: " + ex.Message;
MessageService.ShowError(err);
LoggingService.Error(err);
DisposeProcessMonitor();
return;
}
string version = debugger.GetProgramVersion(processStartInfo.FileName);
if (version.StartsWith("v1.0")) {
MessageService.ShowMessage("${res:XML.MainMenu.DebugMenu.Error.Net10NotSupported}");
} else if (version.StartsWith("v1.1")) {
MessageService.ShowMessage(StringParser.Parse("${res:XML.MainMenu.DebugMenu.Error.Net10NotSupported}").Replace("1.0", "1.1"));
// } else if (string.IsNullOrEmpty(version)) {
// // Not a managed assembly
// MessageService.ShowMessage("${res:XML.MainMenu.DebugMenu.Error.BadAssembly}");
} else if (debugger.IsKernelDebuggerEnabled) {
MessageService.ShowMessage("${res:XML.MainMenu.DebugMenu.Error.KernelDebuggerEnabled}");
} else {
string version = debugger.GetProgramVersion(processStartInfo.FileName);
attached = false;
if (DebugStarting != null)
DebugStarting(this, EventArgs.Empty);
if (version.StartsWith("v1.0")) {
MessageService.ShowMessage("${res:XML.MainMenu.DebugMenu.Error.Net10NotSupported}");
} else if (version.StartsWith("v1.1")) {
MessageService.ShowMessage(StringParser.Parse("${res:XML.MainMenu.DebugMenu.Error.Net10NotSupported}").Replace("1.0", "1.1"));
// } else if (string.IsNullOrEmpty(version)) {
// // Not a managed assembly
// MessageService.ShowMessage("${res:XML.MainMenu.DebugMenu.Error.BadAssembly}");
} else if (debugger.IsKernelDebuggerEnabled) {
MessageService.ShowMessage("${res:XML.MainMenu.DebugMenu.Error.KernelDebuggerEnabled}");
} else {
attached = false;
if (DebugStarting != null)
DebugStarting(this, EventArgs.Empty);
try {
// set the JIT flag for evaluating optimized code
Process.DebugMode = DebugModeFlag.Debug;
Process process = debugger.Start(processStartInfo.FileName,
processStartInfo.WorkingDirectory,
processStartInfo.Arguments);
SelectProcess(process);
} catch (System.Exception e) {
// COMException: The request is not supported. (Exception from HRESULT: 0x80070032)
// COMException: The application has failed to start because its side-by-side configuration is incorrect. Please see the application event log for more detail. (Exception from HRESULT: 0x800736B1)
// COMException: The requested operation requires elevation. (Exception from HRESULT: 0x800702E4)
// COMException: The directory name is invalid. (Exception from HRESULT: 0x8007010B)
// BadImageFormatException: is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)
// UnauthorizedAccessException: Отказано в доступе. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))
if (e is COMException || e is BadImageFormatException || e is UnauthorizedAccessException) {
string msg = StringParser.Parse("${res:XML.MainMenu.DebugMenu.Error.CannotStartProcess}");
msg += " " + e.Message;
// TODO: Remove
if (e is COMException && ((uint)((COMException)e).ErrorCode == 0x80070032)) {
msg += Environment.NewLine + Environment.NewLine;
msg += "64-bit debugging is not supported. Please set Project -> Project Options... -> Compiling -> Target CPU to 32bit.";
}
MessageService.ShowMessage(msg);
if (DebugStopped != null)
DebugStopped(this, EventArgs.Empty);
} else {
throw;
try {
// set the JIT flag for evaluating optimized code
Process.DebugMode = DebugModeFlag.Debug;
Process process = debugger.Start(processStartInfo.FileName,
processStartInfo.WorkingDirectory,
processStartInfo.Arguments);
SelectProcess(process);
} catch (System.Exception e) {
// COMException: The request is not supported. (Exception from HRESULT: 0x80070032)
// COMException: The application has failed to start because its side-by-side configuration is incorrect. Please see the application event log for more detail. (Exception from HRESULT: 0x800736B1)
// COMException: The requested operation requires elevation. (Exception from HRESULT: 0x800702E4)
// COMException: The directory name is invalid. (Exception from HRESULT: 0x8007010B)
// BadImageFormatException: is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)
// UnauthorizedAccessException: Отказано в доступе. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))
if (e is COMException || e is BadImageFormatException || e is UnauthorizedAccessException) {
string msg = StringParser.Parse("${res:XML.MainMenu.DebugMenu.Error.CannotStartProcess}");
msg += " " + e.Message;
// TODO: Remove
if (e is COMException && ((uint)((COMException)e).ErrorCode == 0x80070032)) {
msg += Environment.NewLine + Environment.NewLine;
msg += "64-bit debugging is not supported. Please set Project -> Project Options... -> Compiling -> Target CPU to 32bit.";
}
MessageService.ShowMessage(msg);
if (DebugStopped != null)
DebugStopped(this, EventArgs.Empty);
} else {
throw;
}
}
}
@ -327,63 +251,7 @@ namespace ICSharpCode.SharpDevelop.Services @@ -327,63 +251,7 @@ namespace ICSharpCode.SharpDevelop.Services
public void StartWithoutDebugging(ProcessStartInfo processStartInfo)
{
if (FileUtility.IsUrl(processStartInfo.FileName)) {
if (!CheckWebProjectStartInfo())
return;
// we deal with a WebProject
try {
var project = ProjectService.OpenSolution.StartupProject as CompilableProject;
WebProjectOptions options = WebProjectsOptions.Instance.GetWebProjectOptions(project.Name);
string processName = WebProjectService.GetWorkerProcessName(options.Data.WebServer);
if (options.Data.WebServer == WebServer.IISExpress) {
// start IIS express
if (WebProjectService.IsIISExpressInstalled)
System.Diagnostics.Process.Start(WebProjectService.IISExpressProcessLocation);
else {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return;
}
}
// start default application(e.g. browser) or the one specified
switch (project.StartAction) {
case StartAction.Project:
if (FileUtility.IsUrl(options.Data.ProjectUrl)) {
System.Diagnostics.Process.Start(options.Data.ProjectUrl);
} else {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return;
}
break;
case StartAction.Program:
System.Diagnostics.Process.Start(project.StartProgram);
break;
case StartAction.StartURL:
if (FileUtility.IsUrl(project.StartUrl))
System.Diagnostics.Process.Start(project.StartUrl);
else {
string url = string.Concat(options.Data.ProjectUrl, project.StartUrl);
if (FileUtility.IsUrl(url)) {
System.Diagnostics.Process.Start(url);
} else {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return;
}
}
break;
default:
throw new System.Exception("Invalid value for StartAction");
}
} catch (System.Exception ex) {
string err = "Error: " + ex.Message;
MessageService.ShowError(err);
LoggingService.Error(err);
return;
}
} else
System.Diagnostics.Process.Start(processStartInfo);
System.Diagnostics.Process.Start(processStartInfo);
}
public void Stop()
@ -407,67 +275,6 @@ namespace ICSharpCode.SharpDevelop.Services @@ -407,67 +275,6 @@ namespace ICSharpCode.SharpDevelop.Services
} else {
debuggedProcess.Terminate();
}
DisposeProcessMonitor();
}
bool CheckWebProjectStartInfo()
{
// check if we have startup project
var project = ProjectService.OpenSolution.StartupProject as CompilableProject;
if (project == null) {
MessageService.ShowError("${res:ICSharpCode.NoStartupProject}");
return false;
}
// check if we have options
if (WebProjectsOptions.Instance == null) {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return false;
}
// check the options
var options = WebProjectsOptions.Instance.GetWebProjectOptions(project.Name);
if (options == null || options.Data == null || string.IsNullOrEmpty(options.ProjectName) ||
options.Data.WebServer == WebServer.None) {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return false;
}
return true;
}
void OnProcessCreated(System.Diagnostics.Process defaultAppProcess, WebProjectOptions options)
{
if (attached)
return;
string processName = WebProjectService.GetWorkerProcessName(options.Data.WebServer);
var processes = System.Diagnostics.Process.GetProcesses();
int index = processes.FindIndex(p => p.ProcessName.Equals(processName, StringComparison.OrdinalIgnoreCase));
if (index == -1)
return;
Attach(processes[index]);
if (!attached) {
if(options.Data.WebServer == WebServer.IIS) {
string format = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.NoIISWP");
MessageService.ShowMessage(string.Format(format, processName));
} else {
Attach(defaultAppProcess);
if (!attached) {
MessageService.ShowMessage(ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.UnableToAttach"));
}
}
}
}
void DisposeProcessMonitor()
{
if (monitor != null) {
monitor.Stop();
monitor.Dispose();
monitor = null;
}
}
// ExecutionControl:

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

@ -256,10 +256,6 @@ @@ -256,10 +256,6 @@
<Compile Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\ProjectOptionPanel.cs" />
<Compile Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\StorageLocationConverter.cs" />
<Compile Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\StorageLocationPicker.cs" />
<Compile Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\WebProjectOptions\WebProjectOptions.cs" />
<Compile Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\WebProjectOptions\WebProjectOptionsPanel.xaml.cs">
<DependentUpon>WebProjectOptionsPanel.xaml</DependentUpon>
</Compile>
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReferenceHelper.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\AddServiceReferenceDialog.xaml.cs">
<DependentUpon>AddServiceReferenceDialog.xaml</DependentUpon>
@ -316,7 +312,6 @@ @@ -316,7 +312,6 @@
<Compile Include="Src\Gui\Pads\AbstractConsolePad.cs" />
<Compile Include="Src\Gui\Pads\BaseWatchBox.cs" />
<Compile Include="Src\Gui\Pads\OutlinePad.cs" />
<Compile Include="Src\Gui\Pads\ProjectBrowser\Commands\SpecialFileNodeCommands.cs" />
<Compile Include="Src\Gui\Pads\ProjectBrowser\TreeNodes\DirectoryNodeFactory.cs" />
<Compile Include="Src\Gui\Pads\ProjectBrowser\TreeNodes\ServiceReferenceNode.cs" />
<Compile Include="Src\Gui\Pads\ProjectBrowser\TreeNodes\ServiceReferencesFolderNode.cs" />
@ -340,6 +335,8 @@ @@ -340,6 +335,8 @@
<Compile Include="Src\Internal\Templates\File\FileTemplate.cs" />
<Compile Include="Src\Internal\Templates\TextTemplate.cs" />
<Compile Include="Src\Internal\Templates\File\INewFileCreator.cs" />
<Compile Include="Src\Project\Behaviors\DefaultProjectBehavior.cs" />
<Compile Include="Src\Project\Behaviors\DotNetStartBehavior.cs" />
<Compile Include="Src\Project\Behaviors\ProjectBehavior.cs" />
<Compile Include="Src\Project\Behaviors\ProjectBehaviorService.cs" />
<Compile Include="Src\Project\Behaviors\ProjectBehaviorSupportedConditionEvaluator.cs" />
@ -733,9 +730,6 @@ @@ -733,9 +730,6 @@
<Compile Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\Publish.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\aaDebugOptions.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\BuildEvents.cs">
<SubType>UserControl</SubType>
<DependentUpon>BuildEvents.xaml</DependentUpon>
@ -884,7 +878,6 @@ @@ -884,7 +878,6 @@
<Page Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\ProjectOptionPanel.xaml">
<DependentUpon>ProjectOptionPanel.cs</DependentUpon>
</Page>
<Page Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\WebProjectOptions\WebProjectOptionsPanel.xaml" />
<Page Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\AddServiceReferenceDialog.xaml" />
<Page Include="Src\Gui\Dialogs\ReferenceDialog\ServiceReference\AdvancedServiceDialog.xaml" />
<Page Include="Src\Services\RefactoringService\ContextActions\ContextActionsBulbControl.xaml" />
@ -923,7 +916,7 @@ @@ -923,7 +916,7 @@
<Folder Include="Src\Editor\CodeCompletion" />
<Folder Include="Src\Editor\Commands" />
<Folder Include="Src\Editor\Search" />
<Folder Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\WebProjectOptions" />
<Folder Include="..\..\..\AddIns\BackendBindings\AspNet.Mvc\Project\Src\WebProjectOptions" />
<Folder Include="Src\Gui\Pads\TaskList" />
<Folder Include="Src\Services\Debugger\Tooltips" />
<Folder Include="Src\Services\RefactoringService\ContextActions" />

4
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/DebugOptions.xaml

@ -133,9 +133,5 @@ @@ -133,9 +133,5 @@
</Button>
</Grid>
</GroupBox>
<local:WebProjectOptionsPanel Grid.Row="2" Margin="5"
Visibility="{Binding IsWebProject}" >
</local:WebProjectOptionsPanel>
</Grid>
</optionpanels:ProjectOptionPanel>

123
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/aaDebugOptions.cs

@ -1,123 +0,0 @@ @@ -1,123 +0,0 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Forms.Integration;
using System.Windows.Media;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Project;
using RadioBinding = System.Collections.Generic.KeyValuePair<ICSharpCode.SharpDevelop.Project.StartAction, System.Windows.Forms.RadioButton>;
namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
{
public class aaDebugOptions : AbstractXmlFormsProjectOptionPanel
{
public override void LoadPanelContents()
{
SetupFromXmlResource("ProjectOptions.DebugOptions.xfrm");
ConnectBrowseButton("startExternalProgramBrowseButton", "startExternalProgramTextBox",
"${res:SharpDevelop.FileFilter.ExecutableFiles}|*.exe;*.com;*.pif;*.bat;*.cmd",
TextBoxEditMode.EditRawProperty);
ConnectBrowseFolder("workingDirectoryBrowseButton", "workingDirectoryTextBox",
TextBoxEditMode.EditRawProperty);
InitializeHelper();
ConfigurationGuiBinding b;
ChooseStorageLocationButton locationButton;
b = helper.BindRadioEnum("StartAction",
new RadioBinding(StartAction.Project, Get<RadioButton>("startProject")),
new RadioBinding(StartAction.Program, Get<RadioButton>("startExternalProgram")),
new RadioBinding(StartAction.StartURL, Get<RadioButton>("startBrowserInURL")));
b.DefaultLocation = PropertyStorageLocations.ConfigurationSpecific;
locationButton = b.CreateLocationButtonInPanel("startActionGroupBox");
b = helper.BindString("startExternalProgramTextBox", "StartProgram", TextBoxEditMode.EditRawProperty);
b.DefaultLocation = PropertyStorageLocations.ConfigurationSpecific;
b.RegisterLocationButton(locationButton);
b = helper.BindString("startBrowserInURLTextBox", "StartURL", TextBoxEditMode.EditRawProperty);
b.DefaultLocation = PropertyStorageLocations.ConfigurationSpecific;
b.RegisterLocationButton(locationButton);
Get<RadioButton>("startExternalProgram").CheckedChanged += UpdateEnabledStates;
Get<RadioButton>("startBrowserInURL").CheckedChanged += UpdateEnabledStates;
b = helper.BindString("commandLineArgumentsTextBox", "StartArguments", TextBoxEditMode.EditRawProperty);
locationButton = b.CreateLocationButtonInPanel("startOptionsGroupBox");
b = helper.BindString("workingDirectoryTextBox", "StartWorkingDirectory", TextBoxEditMode.EditRawProperty);
b.RegisterLocationButton(locationButton);
UpdateEnabledStates(this, EventArgs.Empty);
helper.AddConfigurationSelector(this);
// add server for web projects
if (ProjectService.CurrentProject is CompilableProject) {
bool isWebProject = ((CompilableProject)ProjectService.CurrentProject).IsWebProject;
if (isWebProject) {
GroupBox winFormsGroupBox = new GroupBox();
winFormsGroupBox.Text = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.Server");
winFormsGroupBox.Location = new System.Drawing.Point(8,240);
winFormsGroupBox.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right;
winFormsGroupBox.Size = new System.Drawing.Size(460,200);
Controls.Add(winFormsGroupBox);
ElementHost host = new ElementHost();
host.Top = 30;
host.Left = 10;
host.AutoSize = true;
host.Child = new WebProjectOptionsPanel(this);
winFormsGroupBox.Controls.Add(host);
}
}
}
public override bool StorePanelContents()
{
// SaveWpfSettings();
return base.StorePanelContents();
}
void UpdateEnabledStates(object sender, EventArgs e)
{
Get<TextBox>("startExternalProgram").Enabled = Get<Button>("startExternalProgramBrowse").Enabled = Get<RadioButton>("startExternalProgram").Checked;
Get<TextBox>("startBrowserInURL").Enabled = Get<RadioButton>("startBrowserInURL").Checked;
}
public void SetStartAction(StartAction action)
{
switch(action) {
case StartAction.Project:
Get<RadioButton>("startProject").Checked = true;
break;
case StartAction.Program:
Get<RadioButton>("startExternalProgram").Checked = true;
break;
case StartAction.StartURL:
Get<RadioButton>("startBrowserInURL").Checked = true;
break;
default:
throw new NotSupportedException("Unknown action!");
}
UpdateEnabledStates(null, EventArgs.Empty);
}
public void SetExternalProgram(string externalProgram)
{
if (externalProgram == null)
return;
Get<TextBox>("startExternalProgram").Text = externalProgram;
}
}
}

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

@ -68,48 +68,14 @@ namespace ICSharpCode.SharpDevelop.Project @@ -68,48 +68,14 @@ namespace ICSharpCode.SharpDevelop.Project
/// Saves project preferences (currently opened files, bookmarks etc.) to the
/// a property container.
/// </summary>
public virtual Properties CreateMemento()
public Properties CreateMemento()
{
WorkbenchSingleton.AssertMainThread();
// breakpoints and files
Properties properties = new Properties();
properties.Set("bookmarks", ICSharpCode.SharpDevelop.Bookmarks.BookmarkManager.GetProjectBookmarks(this).ToArray());
List<string> files = new List<string>();
foreach (string fileName in FileService.GetOpenFiles()) {
if (fileName != null && IsFileInProject(fileName)) {
files.Add(fileName);
}
}
properties.Set("files", files.ToArray());
// web project properties
var webOptions = WebProjectsOptions.Instance.GetWebProjectOptions(Name);
if (webOptions != null)
properties.Set("WebProjectOptions", webOptions);
// other project data
properties.Set("projectSavedData", ProjectSpecificProperties ?? new Properties());
return properties;
return GetOrCreateBehavior().CreateMemento();
}
public virtual void SetMemento(Properties memento)
public void SetMemento(Properties memento)
{
WorkbenchSingleton.AssertMainThread();
foreach (ICSharpCode.SharpDevelop.Bookmarks.SDBookmark mark in memento.Get("bookmarks", new ICSharpCode.SharpDevelop.Bookmarks.SDBookmark[0])) {
ICSharpCode.SharpDevelop.Bookmarks.BookmarkManager.AddMark(mark);
}
foreach (string fileName in memento.Get("files", new string[0])) {
filesToOpenAfterSolutionLoad.Add(fileName);
}
// web project properties
WebProjectsOptions.Instance.SetWebProjectOptions(Name, memento.Get("WebProjectOptions", new WebProjectOptions()) as WebProjectOptions);
// other project data
ProjectSpecificProperties = memento.Get("projectSavedData", new Properties());
GetOrCreateBehavior().SetMemento(memento);
}
#endregion
@ -305,7 +271,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -305,7 +271,7 @@ namespace ICSharpCode.SharpDevelop.Project
[Browsable(false)]
public virtual ICollection<ItemType> AvailableFileItemTypes {
get {
return GetOrCreateBehavior().AvailableFileItemTypes;
return ItemType.DefaultFileItems;
}
}
@ -384,7 +350,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -384,7 +350,7 @@ namespace ICSharpCode.SharpDevelop.Project
}
[Browsable(false)]
public virtual bool IsStartable {
public bool IsStartable {
get {
return GetOrCreateBehavior().IsStartable;
}
@ -397,7 +363,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -397,7 +363,7 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
public virtual void Start(bool withDebugging)
public void Start(bool withDebugging)
{
GetOrCreateBehavior().Start(withDebugging);
}
@ -408,7 +374,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -408,7 +374,7 @@ namespace ICSharpCode.SharpDevelop.Project
/// <exception cref="ProjectStartException">Occurs when the project cannot be started.</exception>
/// <returns>ProcessStartInfo used to start the project.
/// Note: this can be a ProcessStartInfo with a URL as filename!</returns>
public virtual ProcessStartInfo CreateStartInfo()
public ProcessStartInfo CreateStartInfo()
{
return GetOrCreateBehavior().CreateStartInfo();
}
@ -468,7 +434,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -468,7 +434,7 @@ namespace ICSharpCode.SharpDevelop.Project
/// <summary>
/// Creates a new projectItem for the passed itemType
/// </summary>
public virtual ProjectItem CreateProjectItem(IProjectItemBackendStore item)
public ProjectItem CreateProjectItem(IProjectItemBackendStore item)
{
return GetOrCreateBehavior().CreateProjectItem(item);
}
@ -500,7 +466,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -500,7 +466,7 @@ namespace ICSharpCode.SharpDevelop.Project
/// Returns ItemType.None for unknown items.
/// Every override should call base.GetDefaultItemType for unknown file extensions.
/// </summary>
public virtual ItemType GetDefaultItemType(string fileName)
public ItemType GetDefaultItemType(string fileName)
{
return GetOrCreateBehavior().GetDefaultItemType(fileName);
}
@ -598,7 +564,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -598,7 +564,7 @@ namespace ICSharpCode.SharpDevelop.Project
return projectOptions;
}
public virtual void ProjectCreationComplete()
public void ProjectCreationComplete()
{
GetOrCreateBehavior().ProjectCreationComplete();
}
@ -614,7 +580,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -614,7 +580,7 @@ namespace ICSharpCode.SharpDevelop.Project
[Browsable(false)]
public Properties ProjectSpecificProperties {
get; protected set;
get; internal set;
}
protected virtual ProjectBehavior CreateDefaultBehavior()

125
src/Main/Base/Project/Src/Project/Behaviors/DefaultProjectBehavior.cs

@ -0,0 +1,125 @@ @@ -0,0 +1,125 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Gui.OptionPanels;
using ICSharpCode.SharpDevelop.Project.Converter;
using ICSharpCode.SharpDevelop.Util;
namespace ICSharpCode.SharpDevelop.Project
{
public sealed class DefaultProjectBehavior : ProjectBehavior
{
public DefaultProjectBehavior(AbstractProject project)
: base(project)
{
}
new AbstractProject Project {
get {
return (AbstractProject)base.Project;
}
}
public override bool IsStartable {
get { return false; }
}
public override void Start(bool withDebugging)
{
ProcessStartInfo psi;
try {
psi = CreateStartInfo();
} catch (ProjectStartException ex) {
MessageService.ShowError(ex.Message);
return;
}
if (withDebugging) {
DebuggerService.CurrentDebugger.Start(psi);
} else {
DebuggerService.CurrentDebugger.StartWithoutDebugging(psi);
}
}
public override ProcessStartInfo CreateStartInfo()
{
throw new NotSupportedException();
}
public override ItemType GetDefaultItemType(string fileName)
{
return ItemType.None;
}
public override ProjectItem CreateProjectItem(IProjectItemBackendStore item)
{
return new UnknownProjectItem(Project, item);
}
public override void ProjectCreationComplete()
{
}
public override IEnumerable<CompilerVersion> GetAvailableCompilerVersions()
{
yield break;
}
public override void UpgradeProject(CompilerVersion newVersion, TargetFramework newFramework)
{
throw new NotSupportedException();
}
/// <summary>
/// Saves project preferences (currently opened files, bookmarks etc.) to the
/// a property container.
/// </summary>
public override Properties CreateMemento()
{
WorkbenchSingleton.AssertMainThread();
// breakpoints and files
Properties properties = new Properties();
properties.Set("bookmarks", ICSharpCode.SharpDevelop.Bookmarks.BookmarkManager.GetProjectBookmarks(Project).ToArray());
List<string> files = new List<string>();
foreach (string fileName in FileService.GetOpenFiles()) {
if (fileName != null && Project.IsFileInProject(fileName)) {
files.Add(fileName);
}
}
properties.Set("files", files.ToArray());
// other project data
properties.Set("projectSavedData", Project.ProjectSpecificProperties ?? new Properties());
return properties;
}
public override void SetMemento(Properties memento)
{
WorkbenchSingleton.AssertMainThread();
foreach (ICSharpCode.SharpDevelop.Bookmarks.SDBookmark mark in memento.Get("bookmarks", new ICSharpCode.SharpDevelop.Bookmarks.SDBookmark[0])) {
ICSharpCode.SharpDevelop.Bookmarks.BookmarkManager.AddMark(mark);
}
foreach (string fileName in memento.Get("files", new string[0])) {
AbstractProject.filesToOpenAfterSolutionLoad.Add(fileName);
}
// other project data
Project.ProjectSpecificProperties = memento.Get("projectSavedData", new Properties());
base.SetMemento(memento);
}
}
}

363
src/Main/Base/Project/Src/Project/Behaviors/DotNetStartBehavior.cs

@ -0,0 +1,363 @@ @@ -0,0 +1,363 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Gui.OptionPanels;
using ICSharpCode.SharpDevelop.Project.Converter;
using ICSharpCode.SharpDevelop.Util;
namespace ICSharpCode.SharpDevelop.Project
{
public class DotNetStartBehavior : ProjectBehavior
{
static string RemoveQuotes(string text)
{
if (text.StartsWith("\"") && text.EndsWith("\""))
return text.Substring(1, text.Length - 2);
else
return text;
}
public DotNetStartBehavior(CompilableProject project, ProjectBehavior next = null)
: base(project, next)
{
}
public override bool IsStartable {
get {
switch (StartAction) {
case StartAction.Project:
return ((CompilableProject)Project).OutputType == OutputType.Exe || ((CompilableProject)Project).OutputType == OutputType.WinExe;
case StartAction.Program:
return StartProgram.Length > 0;
case StartAction.StartURL:
return StartUrl.Length > 0;
default:
return base.IsStartable;
}
}
}
public override ProcessStartInfo CreateStartInfo()
{
switch (StartAction) {
case StartAction.Project:
return CreateStartInfo(Project.OutputAssemblyFullPath, Project.Directory, StartWorkingDirectory, StartArguments);
case StartAction.Program:
return CreateStartInfo(StartProgram, Project.Directory, StartWorkingDirectory, StartArguments);
case StartAction.StartURL:
string url = StartUrl;
if (!FileUtility.IsUrl(url))
url = "http://" + url;
return new ProcessStartInfo(url);
default:
return base.CreateStartInfo();
}
}
/// <summary>
/// Creates a <see cref="ProcessStartInfo"/> for the specified program, using
/// arguments and working directory from the project options.
/// </summary>
public static ProcessStartInfo CreateStartInfo(string program, string projectDirectory, string startWorkingDirectory, string startArguments)
{
program = RemoveQuotes(program);
if (!FileUtility.IsValidPath(program)) {
throw new ProjectStartException(program + " is not a valid path; the process cannot be started.");
}
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = Path.Combine(projectDirectory, program);
string workingDir = StringParser.Parse(startWorkingDirectory);
if (workingDir.Length == 0) {
psi.WorkingDirectory = Path.GetDirectoryName(psi.FileName);
} else {
workingDir = RemoveQuotes(workingDir);
if (!FileUtility.IsValidPath(workingDir)) {
throw new ProjectStartException("Working directory '" + workingDir + "' is invalid; the process cannot be started. You can specify the working directory in the project options.");
}
psi.WorkingDirectory = Path.Combine(projectDirectory, workingDir);
}
psi.Arguments = StringParser.Parse(startArguments);
if (!File.Exists(psi.FileName)) {
throw new ProjectStartException(psi.FileName + " does not exist and cannot be started.");
}
if (!System.IO.Directory.Exists(psi.WorkingDirectory)) {
throw new ProjectStartException("Working directory " + psi.WorkingDirectory + " does not exist; the process cannot be started. You can specify the working directory in the project options.");
}
return psi;
}
public override void ProjectCreationComplete()
{
TargetFramework fx = ((CompilableProject)Project).CurrentTargetFramework;
if (fx != null && (fx.IsBasedOn(TargetFramework.Net35) || fx.IsBasedOn(TargetFramework.Net35Client))) {
AddDotnet35References();
}
if (fx != null && (fx.IsBasedOn(TargetFramework.Net40) || fx.IsBasedOn(TargetFramework.Net40Client))) {
AddDotnet40References();
}
if (fx != null)
UpdateAppConfig(fx);
base.ProjectCreationComplete();
}
public override ItemType GetDefaultItemType(string fileName)
{
string extension = Path.GetExtension(fileName);
if (".resx".Equals(extension, StringComparison.OrdinalIgnoreCase)
|| ".resources".Equals(extension, StringComparison.OrdinalIgnoreCase))
return ItemType.EmbeddedResource;
return base.GetDefaultItemType(fileName);
}
public override IEnumerable<CompilerVersion> GetAvailableCompilerVersions()
{
return new[] { CompilerVersion.MSBuild20, CompilerVersion.MSBuild35, CompilerVersion.MSBuild40 };
}
public override void UpgradeProject(CompilerVersion newVersion, TargetFramework newFramework)
{
if (!Project.ReadOnly) {
lock (Project.SyncRoot) {
TargetFramework oldFramework = ((CompilableProject)Project).CurrentTargetFramework;
if (newVersion != null && GetAvailableCompilerVersions().Contains(newVersion)) {
((CompilableProject)Project).SetToolsVersion(newVersion.MSBuildVersion.Major + "." + newVersion.MSBuildVersion.Minor);
}
if (newFramework != null) {
UpdateAppConfig(newFramework);
ClientProfileTargetFramework clientProfile = newFramework as ClientProfileTargetFramework;
if (clientProfile != null) {
newFramework = clientProfile.FullFramework;
((MSBuildBasedProject)Project).SetProperty(null, null, "TargetFrameworkProfile", "Client", PropertyStorageLocations.Base, true);
} else {
((MSBuildBasedProject)Project).SetProperty(null, null, "TargetFrameworkProfile", "", PropertyStorageLocations.Base, true);
}
((MSBuildBasedProject)Project).SetProperty(null, null, "TargetFrameworkVersion", newFramework.Name, PropertyStorageLocations.Base, true);
if (oldFramework is ClientProfileTargetFramework)
oldFramework = ((ClientProfileTargetFramework)oldFramework).FullFramework;
if (oldFramework != null && !oldFramework.IsBasedOn(TargetFramework.Net35) && newFramework.IsBasedOn(TargetFramework.Net35))
AddDotnet35References();
else if (oldFramework != null && oldFramework.IsBasedOn(TargetFramework.Net35) && !newFramework.IsBasedOn(TargetFramework.Net35))
RemoveDotnet35References();
if (oldFramework != null && !oldFramework.IsBasedOn(TargetFramework.Net40) && newFramework.IsBasedOn(TargetFramework.Net40))
AddDotnet40References();
else if (oldFramework != null && oldFramework.IsBasedOn(TargetFramework.Net40) && !newFramework.IsBasedOn(TargetFramework.Net40))
RemoveDotnet40References();
}
AddOrRemoveExtensions();
Project.Save();
}
}
}
void AddDotnet35References()
{
AddReferenceIfNotExists("System.Core", "3.5");
if (Project.GetItemsOfType(ItemType.Reference).Any(r => string.Equals(r.Include, "System.Data", StringComparison.OrdinalIgnoreCase))) {
AddReferenceIfNotExists("System.Data.DataSetExtensions", "3.5");
}
if (Project.GetItemsOfType(ItemType.Reference).Any(r => string.Equals(r.Include, "System.Xml", StringComparison.OrdinalIgnoreCase))) {
AddReferenceIfNotExists("System.Xml.Linq", "3.5");
}
}
void RemoveDotnet35References()
{
// undo "AddDotnet35References"
RemoveReference("System.Core");
RemoveReference("System.Data.DataSetExtensions");
RemoveReference("System.Xml.Linq");
}
void AddDotnet40References()
{
if (Project.GetItemsOfType(ItemType.Reference).Any(r => string.Equals(r.Include, "WindowsBase", StringComparison.OrdinalIgnoreCase))) {
AddReferenceIfNotExists("System.Xaml", "4.0");
}
}
protected virtual void RemoveDotnet40References()
{
RemoveReference("System.Xaml");
}
void AddReferenceIfNotExists(string name, string requiredTargetFramework)
{
if (!(Project.GetItemsOfType(ItemType.Reference).Any(r => string.Equals(r.Include, name, StringComparison.OrdinalIgnoreCase)))) {
ReferenceProjectItem rpi = new ReferenceProjectItem(Project, name);
if (requiredTargetFramework != null)
rpi.SetMetadata("RequiredTargetFramework", requiredTargetFramework);
ProjectService.AddProjectItem(Project, rpi);
}
}
void RemoveReference(string name)
{
ProjectItem reference = Project.GetItemsOfType(ItemType.Reference).FirstOrDefault(r => string.Equals(r.Include, name, StringComparison.OrdinalIgnoreCase));
if (reference != null)
ProjectService.RemoveProjectItem(Project, reference);
}
void UpdateAppConfig(TargetFramework newFramework)
{
// When changing the target framework, update any existing app.config
// Also, for applications (not libraries), create an app.config is it is required for the target framework
bool createAppConfig = newFramework.RequiresAppConfigEntry && (((CompilableProject)Project).OutputType != OutputType.Library && ((CompilableProject)Project).OutputType != OutputType.Module);
string appConfigFileName = CompilableProject.GetAppConfigFile(Project, createAppConfig);
if (appConfigFileName == null)
return;
using (FakeXmlViewContent xml = new FakeXmlViewContent(appConfigFileName)) {
if (xml.Document != null) {
XElement configuration = xml.Document.Root;
XElement startup = configuration.Element("startup");
if (startup == null) {
startup = new XElement("startup");
if (configuration.HasElements && configuration.Elements().First().Name == "configSections") {
// <configSections> must be first element
configuration.Elements().First().AddAfterSelf(startup);
} else {
startup = configuration.AddFirstWithIndentation(startup);
}
}
XElement supportedRuntime = startup.Element("supportedRuntime");
if (supportedRuntime == null) {
supportedRuntime = startup.AddFirstWithIndentation(new XElement("supportedRuntime"));
}
supportedRuntime.SetAttributeValue("version", newFramework.SupportedRuntimeVersion);
supportedRuntime.SetAttributeValue("sku", newFramework.SupportedSku);
}
}
}
protected virtual void AddOrRemoveExtensions()
{
}
#region CreateProjectItem
/// <summary>
/// Creates a new projectItem for the passed itemType
/// </summary>
public override ProjectItem CreateProjectItem(IProjectItemBackendStore item)
{
switch (item.ItemType.ItemName) {
case "Reference":
return new ReferenceProjectItem(Project, item);
case "ProjectReference":
return new ProjectReferenceProjectItem(Project, item);
case "COMReference":
return new ComReferenceProjectItem(Project, item);
case "Import":
return new ImportProjectItem(Project, item);
case "None":
case "Compile":
case "EmbeddedResource":
case "Resource":
case "Content":
case "Folder":
return new FileProjectItem(Project, item);
case "WebReferenceUrl":
return new WebReferenceUrl(Project, item);
case "WebReferences":
return new WebReferencesProjectItem(Project, item);
case "WCFMetadata":
return new ServiceReferencesProjectItem(Project, item);
case "WCFMetadataStorage":
return new ServiceReferenceProjectItem(Project, item);
default:
if (Project.AvailableFileItemTypes.Contains(item.ItemType)
|| SafeFileExists(Project.Directory, item.EvaluatedInclude))
return new FileProjectItem(Project, item);
return base.CreateProjectItem(item);
}
}
static bool SafeFileExists(string directory, string fileName)
{
try {
return File.Exists(Path.Combine(directory, fileName));
} catch (Exception) {
return false;
}
}
#endregion
#region Starting (debugging)
public string StartProgram {
get {
return ((MSBuildBasedProject)Project).GetEvaluatedProperty("StartProgram") ?? "";
}
set {
((MSBuildBasedProject)Project).SetProperty("StartProgram", string.IsNullOrEmpty(value) ? null : value);
}
}
public string StartUrl {
get {
return ((MSBuildBasedProject)Project).GetEvaluatedProperty("StartURL") ?? "";
}
set {
((MSBuildBasedProject)Project).SetProperty("StartURL", string.IsNullOrEmpty(value) ? null : value);
}
}
public StartAction StartAction {
get {
try {
return (StartAction)Enum.Parse(typeof(StartAction), ((MSBuildBasedProject)Project).GetEvaluatedProperty("StartAction") ?? "Project");
} catch (ArgumentException) {
return StartAction.Project;
}
}
set {
((MSBuildBasedProject)Project).SetProperty("StartAction", value.ToString());
}
}
public string StartArguments {
get {
return ((MSBuildBasedProject)Project).GetEvaluatedProperty("StartArguments") ?? "";
}
set {
((MSBuildBasedProject)Project).SetProperty("StartArguments", string.IsNullOrEmpty(value) ? null : value);
}
}
public string StartWorkingDirectory {
get {
return ((MSBuildBasedProject)Project).GetEvaluatedProperty("StartWorkingDirectory") ?? "";
}
set {
((MSBuildBasedProject)Project).SetProperty("StartWorkingDirectory", string.IsNullOrEmpty(value) ? null : value);
}
}
#endregion
}
}

99
src/Main/Base/Project/Src/Project/Behaviors/ProjectBehavior.cs

@ -4,10 +4,15 @@ @@ -4,10 +4,15 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Gui.OptionPanels;
using ICSharpCode.SharpDevelop.Project.Converter;
using ICSharpCode.SharpDevelop.Util;
namespace ICSharpCode.SharpDevelop.Project
{
@ -16,10 +21,13 @@ namespace ICSharpCode.SharpDevelop.Project @@ -16,10 +21,13 @@ namespace ICSharpCode.SharpDevelop.Project
ProjectBehavior next;
protected IProject Project { get; private set; }
public ProjectBehavior(IProject project, ProjectBehavior next = null)
public ProjectBehavior()
{
}
protected ProjectBehavior(IProject project, ProjectBehavior next = null)
{
if (project == null)
throw new ArgumentNullException("project");
this.Project = project;
this.next = next;
}
@ -73,72 +81,67 @@ namespace ICSharpCode.SharpDevelop.Project @@ -73,72 +81,67 @@ namespace ICSharpCode.SharpDevelop.Project
return null;
}
public virtual ICollection<ItemType> AvailableFileItemTypes {
get {
if (this.next != null)
return next.AvailableFileItemTypes;
return null;
}
}
public virtual void ProjectCreationComplete()
{
if (this.next != null)
next.ProjectCreationComplete();
}
}
sealed class DefaultProjectBehavior : ProjectBehavior
{
public DefaultProjectBehavior(IProject project)
: base(project)
public virtual IEnumerable<CompilerVersion> GetAvailableCompilerVersions()
{
if (this.next != null)
return next.GetAvailableCompilerVersions();
return Enumerable.Empty<CompilerVersion>();
}
public override bool IsStartable {
get { return false; }
public virtual void UpgradeProject(CompilerVersion newVersion, TargetFramework newFramework)
{
if (this.next != null)
next.UpgradeProject(newVersion, newFramework);
}
public override void Start(bool withDebugging)
public virtual Properties CreateMemento()
{
ProcessStartInfo psi;
try {
if (!(Project is AbstractProject))
return;
psi = ((AbstractProject)Project).CreateStartInfo();
} catch (ProjectStartException ex) {
MessageService.ShowError(ex.Message);
return;
}
if (withDebugging) {
DebuggerService.CurrentDebugger.Start(psi);
} else {
DebuggerService.CurrentDebugger.StartWithoutDebugging(psi);
}
if (this.next != null)
return next.CreateMemento();
throw new InvalidOperationException();
}
public override ProcessStartInfo CreateStartInfo()
public virtual void SetMemento(Properties memento)
{
throw new NotSupportedException();
if (this.next != null)
next.SetMemento(memento);
}
}
public class XamlBehavior : ProjectBehavior
{
public override ItemType GetDefaultItemType(string fileName)
{
return ItemType.None;
if (".xaml".Equals(Path.GetExtension(fileName), StringComparison.OrdinalIgnoreCase))
return ItemType.Page;
return base.GetDefaultItemType(fileName);
}
public override ProjectItem CreateProjectItem(IProjectItemBackendStore item)
{
return new UnknownProjectItem(Project, item);
}
public class SilverlightBehavior : ProjectBehavior
{
public override bool IsStartable {
get { return TestPageFileName.Length > 0; }
}
public override ICollection<ItemType> AvailableFileItemTypes {
get { return ItemType.DefaultFileItems; }
public override ProcessStartInfo CreateStartInfo()
{
string pagePath = "file:///" + Path.Combine(((CompilableProject)Project).OutputFullPath, TestPageFileName);
return new ProcessStartInfo(pagePath);
}
public override void ProjectCreationComplete()
{
public string TestPageFileName {
get { return ((MSBuildBasedProject)Project).GetEvaluatedProperty("TestPageFileName") ?? ""; }
set { ((MSBuildBasedProject)Project).SetProperty("TestPageFileName", string.IsNullOrEmpty(value) ? null : value); }
}
}
}
}

341
src/Main/Base/Project/Src/Project/CompilableProject.cs

@ -31,8 +31,6 @@ namespace ICSharpCode.SharpDevelop.Project @@ -31,8 +31,6 @@ namespace ICSharpCode.SharpDevelop.Project
/// </summary>
public abstract class CompilableProject : MSBuildBasedProject, IUpgradableProject
{
public const string LocalHost = "http://localhost";
#region Static methods
/// <summary>
/// Gets the file extension of the assembly created when building a project
@ -211,177 +209,6 @@ namespace ICSharpCode.SharpDevelop.Project @@ -211,177 +209,6 @@ namespace ICSharpCode.SharpDevelop.Project
return newProjectContent;
}
#region Starting (debugging)
public override bool IsStartable {
get {
if (IsSilverlightProject) {
return TestPageFileName.Length > 0;
}
if (IsWebProject)
return true;
switch (this.StartAction) {
case StartAction.Project:
return OutputType == OutputType.Exe || OutputType == OutputType.WinExe;
case StartAction.Program:
return this.StartProgram.Length > 0;
case StartAction.StartURL:
return this.StartUrl.Length > 0;
default:
return false;
}
}
}
static string RemoveQuotes(string text)
{
if (text.StartsWith("\"") && text.EndsWith("\""))
return text.Substring(1, text.Length - 2);
else
return text;
}
/// <summary>
/// Creates a <see cref="ProcessStartInfo"/> for the specified program, using
/// arguments and working directory from the project options.
/// </summary>
protected ProcessStartInfo CreateStartInfo(string program)
{
program = RemoveQuotes(program);
if (!FileUtility.IsValidPath(program)) {
throw new ProjectStartException(program + " is not a valid path; the process cannot be started.");
}
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = Path.Combine(Directory, program);
string workingDir = StringParser.Parse(this.StartWorkingDirectory);
if (workingDir.Length == 0) {
psi.WorkingDirectory = Path.GetDirectoryName(psi.FileName);
} else {
workingDir = RemoveQuotes(workingDir);
if (!FileUtility.IsValidPath(workingDir)) {
throw new ProjectStartException("Working directory '" + workingDir + "' is invalid; the process cannot be started. You can specify the working directory in the project options.");
}
psi.WorkingDirectory = Path.Combine(Directory, workingDir);
}
psi.Arguments = StringParser.Parse(this.StartArguments);
if (!File.Exists(psi.FileName)) {
throw new ProjectStartException(psi.FileName + " does not exist and cannot be started.");
}
if (!System.IO.Directory.Exists(psi.WorkingDirectory)) {
throw new ProjectStartException("Working directory " + psi.WorkingDirectory + " does not exist; the process cannot be started. You can specify the working directory in the project options.");
}
return psi;
}
public override ProcessStartInfo CreateStartInfo()
{
if (IsSilverlightProject) {
string pagePath = "file:///" + Path.Combine(OutputFullPath, TestPageFileName);
return new ProcessStartInfo(pagePath);
}
switch (this.StartAction) {
case StartAction.Project:
if (IsWebProject)
return new ProcessStartInfo(LocalHost);
return CreateStartInfo(this.OutputAssemblyFullPath);
case StartAction.Program:
return CreateStartInfo(this.StartProgram);
case StartAction.StartURL:
string url = this.StartUrl;
if (!FileUtility.IsUrl(url))
url = "http://" + url;
return new ProcessStartInfo(url);
default:
throw new System.ComponentModel.InvalidEnumArgumentException("StartAction", (int)this.StartAction, typeof(StartAction));
}
}
[Browsable(false)]
public string StartProgram {
get {
return GetEvaluatedProperty("StartProgram") ?? "";
}
set {
SetProperty("StartProgram", string.IsNullOrEmpty(value) ? null : value);
}
}
[Browsable(false)]
public string StartUrl {
get {
return GetEvaluatedProperty("StartURL") ?? "";
}
set {
SetProperty("StartURL", string.IsNullOrEmpty(value) ? null : value);
}
}
[Browsable(false)]
public StartAction StartAction {
get {
try {
return (StartAction)Enum.Parse(typeof(StartAction), GetEvaluatedProperty("StartAction") ?? "Project");
} catch (ArgumentException) {
return StartAction.Project;
}
}
set {
SetProperty("StartAction", value.ToString());
}
}
[Browsable(false)]
public string StartArguments {
get {
return GetEvaluatedProperty("StartArguments") ?? "";
}
set {
SetProperty("StartArguments", string.IsNullOrEmpty(value) ? null : value);
}
}
[Browsable(false)]
public string StartWorkingDirectory {
get {
return GetEvaluatedProperty("StartWorkingDirectory") ?? "";
}
set {
SetProperty("StartWorkingDirectory", string.IsNullOrEmpty(value) ? null : value);
}
}
[Browsable(false)]
public bool IsSilverlightProject {
get {
string guids = GetEvaluatedProperty("ProjectTypeGuids") ?? "";
return guids.ToUpperInvariant().Contains("A1591282-1198-4647-A2B1-27E5FF5F6F3B");
}
}
[Browsable(false)]
public override bool IsWebProject {
get {
string guids = GetEvaluatedProperty("ProjectTypeGuids") ?? "";
return guids.ToUpperInvariant().Contains("349C5851-65DF-11DA-9384-00065B846F21");
}
}
[Browsable(false)]
public string TestPageFileName {
get {
return GetEvaluatedProperty("TestPageFileName") ?? "";
}
set {
SetProperty("TestPageFileName", string.IsNullOrEmpty(value) ? null : value);
}
}
#endregion
protected override void OnActiveConfigurationChanged(EventArgs e)
{
base.OnActiveConfigurationChanged(e);
@ -423,88 +250,19 @@ namespace ICSharpCode.SharpDevelop.Project @@ -423,88 +250,19 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
public override ItemType GetDefaultItemType(string fileName)
{
string extension = Path.GetExtension(fileName);
if (".resx".Equals(extension, StringComparison.OrdinalIgnoreCase)
|| ".resources".Equals(extension, StringComparison.OrdinalIgnoreCase))
{
return ItemType.EmbeddedResource;
} else if (".xaml".Equals(extension, StringComparison.OrdinalIgnoreCase)) {
return ItemType.Page;
} else {
return base.GetDefaultItemType(fileName);
}
}
public override void ProjectCreationComplete()
{
TargetFramework fx = this.CurrentTargetFramework;
if (fx != null && (fx.IsBasedOn(TargetFramework.Net35) || fx.IsBasedOn(TargetFramework.Net35Client))) {
AddDotnet35References();
}
if (fx != null && (fx.IsBasedOn(TargetFramework.Net40) || fx.IsBasedOn(TargetFramework.Net40Client))) {
AddDotnet40References();
}
if (fx != null)
UpdateAppConfig(fx);
base.ProjectCreationComplete();
}
protected virtual void AddDotnet35References()
{
AddReferenceIfNotExists("System.Core", "3.5");
if (GetItemsOfType(ItemType.Reference).Any(r => string.Equals(r.Include, "System.Data", StringComparison.OrdinalIgnoreCase))) {
AddReferenceIfNotExists("System.Data.DataSetExtensions", "3.5");
}
if (GetItemsOfType(ItemType.Reference).Any(r => string.Equals(r.Include, "System.Xml", StringComparison.OrdinalIgnoreCase))) {
AddReferenceIfNotExists("System.Xml.Linq", "3.5");
}
}
protected virtual void RemoveDotnet35References()
{
// undo "AddDotnet35References"
RemoveReference("System.Core");
RemoveReference("System.Data.DataSetExtensions");
RemoveReference("System.Xml.Linq");
}
protected virtual void AddDotnet40References()
{
if (GetItemsOfType(ItemType.Reference).Any(r => string.Equals(r.Include, "WindowsBase", StringComparison.OrdinalIgnoreCase))) {
AddReferenceIfNotExists("System.Xaml", "4.0");
public StartAction StartAction {
get {
try {
return (StartAction)Enum.Parse(typeof(StartAction), GetEvaluatedProperty("StartAction") ?? "Project");
} catch (ArgumentException) {
return StartAction.Project;
}
}
}
protected virtual void RemoveDotnet40References()
{
RemoveReference("System.Xaml");
}
void AddReferenceIfNotExists(string name, string requiredTargetFramework)
{
if (!(GetItemsOfType(ItemType.Reference).Any(r => string.Equals(r.Include, name, StringComparison.OrdinalIgnoreCase)))) {
ReferenceProjectItem rpi = new ReferenceProjectItem(this, name);
if (requiredTargetFramework != null)
rpi.SetMetadata("RequiredTargetFramework", requiredTargetFramework);
ProjectService.AddProjectItem(this, rpi);
set {
SetProperty("StartAction", value.ToString());
}
}
void RemoveReference(string name)
{
ProjectItem reference = GetItemsOfType(ItemType.Reference).FirstOrDefault(r => string.Equals(r.Include, name, StringComparison.OrdinalIgnoreCase));
if (reference != null)
ProjectService.RemoveProjectItem(this, reference);
}
protected virtual void AddOrRemoveExtensions()
{
}
#region IUpgradableProject
[Browsable(false)]
public virtual bool UpgradeDesired {
@ -513,19 +271,15 @@ namespace ICSharpCode.SharpDevelop.Project @@ -513,19 +271,15 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
static readonly CompilerVersion msbuild20 = new CompilerVersion(new Version(2, 0), "MSBuild 2.0");
static readonly CompilerVersion msbuild35 = new CompilerVersion(new Version(3, 5), "MSBuild 3.5");
static readonly CompilerVersion msbuild40 = new CompilerVersion(new Version(4, 0), "MSBuild 4.0");
public virtual CompilerVersion CurrentCompilerVersion {
get {
switch (MinimumSolutionVersion) {
case Solution.SolutionVersionVS2005:
return msbuild20;
return CompilerVersion.MSBuild20;
case Solution.SolutionVersionVS2008:
return msbuild35;
return CompilerVersion.MSBuild35;
case Solution.SolutionVersionVS2010:
return msbuild40;
return CompilerVersion.MSBuild40;
default:
throw new NotSupportedException();
}
@ -551,46 +305,12 @@ namespace ICSharpCode.SharpDevelop.Project @@ -551,46 +305,12 @@ namespace ICSharpCode.SharpDevelop.Project
public virtual IEnumerable<CompilerVersion> GetAvailableCompilerVersions()
{
return new[] { msbuild20, msbuild35, msbuild40 };
return GetOrCreateBehavior().GetAvailableCompilerVersions();
}
public virtual void UpgradeProject(CompilerVersion newVersion, TargetFramework newFramework)
{
if (!this.ReadOnly) {
lock (SyncRoot) {
TargetFramework oldFramework = this.CurrentTargetFramework;
if (newVersion != null && GetAvailableCompilerVersions().Contains(newVersion)) {
SetToolsVersion(newVersion.MSBuildVersion.Major + "." + newVersion.MSBuildVersion.Minor);
}
if (newFramework != null) {
UpdateAppConfig(newFramework);
ClientProfileTargetFramework clientProfile = newFramework as ClientProfileTargetFramework;
if (clientProfile != null) {
newFramework = clientProfile.FullFramework;
SetProperty(null, null, "TargetFrameworkProfile", "Client", PropertyStorageLocations.Base, true);
} else {
SetProperty(null, null, "TargetFrameworkProfile", "", PropertyStorageLocations.Base, true);
}
SetProperty(null, null, "TargetFrameworkVersion", newFramework.Name, PropertyStorageLocations.Base, true);
if (oldFramework is ClientProfileTargetFramework)
oldFramework = ((ClientProfileTargetFramework)oldFramework).FullFramework;
if (oldFramework != null && !oldFramework.IsBasedOn(TargetFramework.Net35) && newFramework.IsBasedOn(TargetFramework.Net35))
AddDotnet35References();
else if (oldFramework != null && oldFramework.IsBasedOn(TargetFramework.Net35) && !newFramework.IsBasedOn(TargetFramework.Net35))
RemoveDotnet35References();
if (oldFramework != null && !oldFramework.IsBasedOn(TargetFramework.Net40) && newFramework.IsBasedOn(TargetFramework.Net40))
AddDotnet40References();
else if (oldFramework != null && oldFramework.IsBasedOn(TargetFramework.Net40) && !newFramework.IsBasedOn(TargetFramework.Net40))
RemoveDotnet40References();
}
AddOrRemoveExtensions();
Save();
}
}
GetOrCreateBehavior().UpgradeProject(newVersion, newFramework);
}
public static FileName GetAppConfigFile(IProject project, bool createIfNotExists)
@ -616,39 +336,6 @@ namespace ICSharpCode.SharpDevelop.Project @@ -616,39 +336,6 @@ namespace ICSharpCode.SharpDevelop.Project
}
return appConfigFileName;
}
void UpdateAppConfig(TargetFramework newFramework)
{
// When changing the target framework, update any existing app.config
// Also, for applications (not libraries), create an app.config is it is required for the target framework
bool createAppConfig = newFramework.RequiresAppConfigEntry && (this.OutputType != OutputType.Library && this.OutputType != OutputType.Module);
string appConfigFileName = GetAppConfigFile(this, createAppConfig);
if (appConfigFileName == null)
return;
using (FakeXmlViewContent xml = new FakeXmlViewContent(appConfigFileName)) {
if (xml.Document != null) {
XElement configuration = xml.Document.Root;
XElement startup = configuration.Element("startup");
if (startup == null) {
startup = new XElement("startup");
if (configuration.HasElements && configuration.Elements().First().Name == "configSections") {
// <configSections> must be first element
configuration.Elements().First().AddAfterSelf(startup);
} else {
startup = configuration.AddFirstWithIndentation(startup);
}
}
XElement supportedRuntime = startup.Element("supportedRuntime");
if (supportedRuntime == null) {
supportedRuntime = startup.AddFirstWithIndentation(new XElement("supportedRuntime"));
}
supportedRuntime.SetAttributeValue("version", newFramework.SupportedRuntimeVersion);
supportedRuntime.SetAttributeValue("sku", newFramework.SupportedSku);
}
}
}
#endregion
}
}

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

@ -51,6 +51,10 @@ namespace ICSharpCode.SharpDevelop.Project.Converter @@ -51,6 +51,10 @@ namespace ICSharpCode.SharpDevelop.Project.Converter
public Version MSBuildVersion { get; private set; }
public string DisplayName { get; private set; }
public static readonly CompilerVersion MSBuild20 = new CompilerVersion(new Version(2, 0), "MSBuild 2.0");
public static readonly CompilerVersion MSBuild35 = new CompilerVersion(new Version(3, 5), "MSBuild 3.5");
public static readonly CompilerVersion MSBuild40 = new CompilerVersion(new Version(4, 0), "MSBuild 4.0");
public virtual IEnumerable<TargetFramework> GetSupportedTargetFrameworks()
{
return from fx in TargetFramework.TargetFrameworks

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

@ -116,7 +116,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -116,7 +116,7 @@ namespace ICSharpCode.SharpDevelop.Project
public event EventHandler MinimumSolutionVersionChanged;
protected void SetToolsVersion(string newToolsVersion)
protected internal void SetToolsVersion(string newToolsVersion)
{
PerformUpdateOnProjectFile(
delegate {
@ -151,63 +151,6 @@ namespace ICSharpCode.SharpDevelop.Project @@ -151,63 +151,6 @@ namespace ICSharpCode.SharpDevelop.Project
return MSBuildInternals.ResolveAssemblyReferences(this, additionalItems);
}
#region CreateProjectItem
/// <summary>
/// Creates a new projectItem for the passed itemType
/// </summary>
public override ProjectItem CreateProjectItem(IProjectItemBackendStore item)
{
switch (item.ItemType.ItemName) {
case "Reference":
return new ReferenceProjectItem(this, item);
case "ProjectReference":
return new ProjectReferenceProjectItem(this, item);
case "COMReference":
return new ComReferenceProjectItem(this, item);
case "Import":
return new ImportProjectItem(this, item);
case "None":
case "Compile":
case "EmbeddedResource":
case "Resource":
case "Content":
case "Folder":
return new FileProjectItem(this, item);
case "WebReferenceUrl":
return new WebReferenceUrl(this, item);
case "WebReferences":
return new WebReferencesProjectItem(this, item);
case "WCFMetadata":
return new ServiceReferencesProjectItem(this, item);
case "WCFMetadataStorage":
return new ServiceReferenceProjectItem(this, item);
default:
if (this.AvailableFileItemTypes.Contains(item.ItemType)
|| SafeFileExists(this.Directory, item.EvaluatedInclude))
{
return new FileProjectItem(this, item);
} else {
return base.CreateProjectItem(item);
}
}
}
static bool SafeFileExists(string directory, string fileName)
{
try {
return File.Exists(Path.Combine(directory, fileName));
} catch (Exception) {
return false;
}
}
#endregion
#region Create new project
public MSBuildBasedProject(ProjectCreateInformation information)
{

6
src/Main/Base/Project/Src/Services/Debugger/DefaultDebugger.cs

@ -190,5 +190,11 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -190,5 +190,11 @@ namespace ICSharpCode.SharpDevelop.Debugging
{
Stop();
}
public bool IsAttached {
get {
return false;
}
}
}
}

4
src/Main/Base/Project/Src/Services/Debugger/IDebugger.cs

@ -32,6 +32,10 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -32,6 +32,10 @@ namespace ICSharpCode.SharpDevelop.Debugging
get; set;
}
bool IsAttached {
get;
}
bool CanDebug(IProject project);
/// <summary>

Loading…
Cancel
Save