Browse Source

Add WebServer group in Debug tab

pull/15/head
Eusebiu Marcu 15 years ago
parent
commit
4d512d8fd7
  1. 439
      data/resources/StringResources.resx
  2. 133
      src/AddIns/Debugger/Debugger.AddIn/Service/WindowsDebugger.cs
  3. 10
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  4. 37
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/DebugOptions.cs
  5. 68
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/WebProjectOptions/WebProjectOptions.cs
  6. 66
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/WebProjectOptions/WebProjectOptionsPanel.xaml
  7. 131
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/WebProjectOptions/WebProjectOptionsPanel.xaml.cs
  8. 17
      src/Main/Base/Project/Src/Project/AbstractProject.cs
  9. 15
      src/Main/Base/Project/Src/Project/CompilableProject.cs
  10. 145
      src/Main/Base/Project/Src/Services/WebProjectService/WebProjectService.cs
  11. 2
      src/Main/Core/Project/ICSharpCode.Core.csproj
  12. 58
      src/Main/Core/Project/Src/Services/RegistryService/RegistryService.cs

439
data/resources/StringResources.resx

File diff suppressed because it is too large Load Diff

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

@ -5,6 +5,7 @@ using System; @@ -5,6 +5,7 @@ using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
@ -13,7 +14,6 @@ using System.Windows.Forms; @@ -13,7 +14,6 @@ using System.Windows.Forms;
using Debugger;
using Debugger.AddIn.Tooltips;
using Debugger.AddIn.TreeModel;
using Debugger.Interop;
using Debugger.Interop.CorPublish;
using ICSharpCode.Core;
using ICSharpCode.Core.WinForms;
@ -23,6 +23,7 @@ using ICSharpCode.NRefactory.Visitors; @@ -23,6 +23,7 @@ using ICSharpCode.NRefactory.Visitors;
using ICSharpCode.SharpDevelop.Bookmarks;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Gui.OptionPanels;
using ICSharpCode.SharpDevelop.Project;
using Process = Debugger.Process;
@ -137,47 +138,93 @@ namespace ICSharpCode.SharpDevelop.Services @@ -137,47 +138,93 @@ namespace ICSharpCode.SharpDevelop.Services
if (!ServiceInitialized) {
InitializeService();
}
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 {
attached = false;
if (DebugStarting != null)
DebugStarting(this, EventArgs.Empty);
if (FileUtility.IsUrl(processStartInfo.FileName))
{
if (ProjectService.CurrentProject == null) {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return;
}
try {
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.";
var debugData = WebProjectsOptions.Instance.GetWebProjectOptions(ProjectService.CurrentProject.Name);
if (debugData == null) {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
return;
}
var project = ProjectService.CurrentProject as CompilableProject;
if (project != null) {
// start browser
if (project.StartAction == StartAction.StartURL)
System.Diagnostics.Process.Start(processStartInfo.FileName);
else
if (!string.IsNullOrEmpty(debugData.Data.ProjectUrl) && debugData.Data.WebServer == WebServer.IIS)
System.Diagnostics.Process.Start("iexplore.exe", debugData.Data.ProjectUrl);
}
// try debug IIS WP
var processes = System.Diagnostics.Process.GetProcesses();
string processName = WebProjectService.WorkerProcessName;
if (debugData.Data.WebServer == WebServer.IISExpress)
processName = "iisexpress";
foreach(var process in processes) {
if (process.ProcessName.ToLower().IndexOf(processName) > -1) {
Attach(process);
break;
}
}
if (!attached) {
string format = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.NoIISWP");
MessageService.ShowMessage(string.Format(format, processName));
}
}
else {
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 {
attached = false;
if (DebugStarting != null)
DebugStarting(this, EventArgs.Empty);
try {
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;
}
MessageService.ShowMessage(msg);
if (DebugStopped != null)
DebugStopped(this, EventArgs.Empty);
} else {
throw;
}
}
}
@ -396,7 +443,7 @@ namespace ICSharpCode.SharpDevelop.Services @@ -396,7 +443,7 @@ namespace ICSharpCode.SharpDevelop.Services
bool CanEvaluate
{
get {
get {
return debuggedProcess != null && !debuggedProcess.IsRunning && debuggedProcess.SelectedStackFrame != null;
}
}
@ -419,7 +466,7 @@ namespace ICSharpCode.SharpDevelop.Services @@ -419,7 +466,7 @@ namespace ICSharpCode.SharpDevelop.Services
}
}
public ITreeNode GetNode(string variable, string currentImageName = null)
public ITreeNode GetNode(string variable, string currentImageName = null)
{
try {
var expression = GetExpression(variable);
@ -659,7 +706,7 @@ namespace ICSharpCode.SharpDevelop.Services @@ -659,7 +706,7 @@ namespace ICSharpCode.SharpDevelop.Services
debuggedProcess.ExceptionThrown += debuggedProcess_ExceptionThrown;
debuggedProcess.Resumed += debuggedProcess_DebuggingResumed;
debuggedProcess.BreakAtBeginning = BreakAtBeginning;
debuggedProcess.BreakAtBeginning = BreakAtBeginning;
}
// reset
BreakAtBeginning = false;

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

@ -44,6 +44,7 @@ @@ -44,6 +44,7 @@
<DefineConstants>TRACE;PUBLICINTERPROCESS</DefineConstants>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.Web.Administration" />
<Reference Include="Mono.Cecil">
<HintPath>..\..\..\Libraries\Mono.Cecil\Mono.Cecil.dll</HintPath>
<Private>False</Private>
@ -62,6 +63,7 @@ @@ -62,6 +63,7 @@
<Reference Include="System.Data" />
<Reference Include="System.Design" />
<Reference Include="System.Drawing" />
<Reference Include="System.EnterpriseServices" />
<Reference Include="System.Web.Services" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
@ -245,6 +247,10 @@ @@ -245,6 +247,10 @@
<DependentUpon>SelectCulturePanel.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<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\ToolNotFoundDialog.cs" />
<Compile Include="Src\Gui\Dialogs\ToolNotFoundDialog.Designer.cs">
<DependentUpon>ToolNotFoundDialog.cs</DependentUpon>
@ -731,6 +737,7 @@ @@ -731,6 +737,7 @@
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\AsyncDiscoveryState.cs" />
<Compile Include="Src\Gui\Dialogs\ReferenceDialog\DiscoveryNetworkCredential.cs" />
<Compile Include="Src\Services\ProjectService\ProjectLoader.cs" />
<Compile Include="Src\Services\WebProjectService\WebProjectService.cs" />
<Compile Include="Src\Util\FakeXmlViewContent.cs" />
<Compile Include="Src\Util\TreeNode.cs" />
<Compile Include="Src\Util\NativeMethods.cs" />
@ -812,6 +819,7 @@ @@ -812,6 +819,7 @@
</ItemGroup>
<ItemGroup>
<Page Include="Src\Bookmarks\Pad\Controls\ListViewPad.xaml" />
<Page Include="Src\Gui\Dialogs\OptionPanels\ProjectOptions\WebProjectOptions\WebProjectOptionsPanel.xaml" />
<Page Include="Src\Services\RefactoringService\ContextActions\ContextActionsBulbControl.xaml" />
<Page Include="Src\Services\RefactoringService\ContextActions\ContextActionsControl.xaml" />
<Page Include="Src\Services\RefactoringService\ContextActions\ContextActionsHeaderedControl.xaml" />
@ -840,9 +848,11 @@ @@ -840,9 +848,11 @@
<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="Src\Gui\Pads\TaskList" />
<Folder Include="Src\Services\Debugger\Tooltips" />
<Folder Include="Src\Services\RefactoringService\ContextActions" />
<Folder Include="Src\Services\WebProjectService" />
<Folder Include="Src\Util" />
<Folder Include="Src\Gui\Pads\ClassBrowser\NodeBuilder" />
<Folder Include="Src\Services\NavigationService" />

37
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/DebugOptions.cs

@ -2,7 +2,11 @@ @@ -2,7 +2,11 @@
// 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.SharpDevelop.Project;
using RadioBinding = System.Collections.Generic.KeyValuePair<ICSharpCode.SharpDevelop.Project.StartAction, System.Windows.Forms.RadioButton>;
@ -50,6 +54,20 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -50,6 +54,20 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
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) {
ElementHost host = new ElementHost();
host.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right;
host.Height = 160;
host.Top = 240;
host.Left = 8;
host.Child = new WebProjectOptionsPanel(this);
Controls.Add(host);
}
}
}
void UpdateEnabledStates(object sender, EventArgs e)
@ -57,5 +75,24 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -57,5 +75,24 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
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);
}
}
}

68
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/WebProjectOptions/WebProjectOptions.cs

@ -0,0 +1,68 @@ @@ -0,0 +1,68 @@
// 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.ComponentModel;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
{
public sealed class WebProjectsOptions
{
private WebProjectsOptions() { }
private static readonly WebProjectsOptions _Instance = new WebProjectsOptions();
private List<WebProjectOptions> options = new List<WebProjectOptions>();
public WebProjectOptions GetWebProjectOptions(string projectName) {
return options.Find(o => o.ProjectName == projectName);
}
public void SetWebProjectOptions(string projectName, WebProjectOptions data)
{
var d = GetWebProjectOptions(projectName);
if (d == null)
{
if (data == null)
data = new WebProjectOptions() { ProjectName = projectName };
options.Add(data);
}
else
{
int index = options.IndexOf(d);
options[index] = data;
}
}
public static WebProjectsOptions Instance {
get {
return _Instance;
}
}
}
[Serializable]
public class WebProjectOptions
{
[DefaultValue(null)]
public string ProjectName { get; set; }
[DefaultValue(null)]
public WebProjectDebugData Data { get; set; }
}
[Serializable]
public class WebProjectDebugData
{
[DefaultValue(null)]
public string ProjectUrl { get; set; }
[DefaultValue(WebServer.None)]
public WebServer WebServer { get; set; }
}
}

66
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/WebProjectOptions/WebProjectOptionsPanel.xaml

@ -0,0 +1,66 @@ @@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<UserControl
x:Class="ICSharpCode.SharpDevelop.Gui.OptionPanels.WebProjectOptionsPanel" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:core="http://icsharpcode.net/sharpdevelop/core" xmlns:widgets="http://icsharpcode.net/sharpdevelop/widgets" xmlns:gui="clr-namespace:ICSharpCode.SharpDevelop.Gui;assembly=ICSharpCode.SharpDevelop" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Margin="0, 0, 0, 10">
<StackPanel
Orientation="Vertical">
<GroupBox
Header="{core:Localize ICSharpCode.WepProjectOptionsPanel.Server}">
<widgets:StackPanelWithSpacing SpaceBetweenItems="5">
<!--IIS Express-->
<widgets:StackPanelWithSpacing SpaceBetweenItems="5">
<RadioButton
IsChecked="False"
GroupName="WebProject"
x:Name="UseIISExpress"
Click="UseIISExpress_Click"
Content="{core:Localize ICSharpCode.WepProjectOptionsPanel.UseIISExpress}" />
</widgets:StackPanelWithSpacing>
<!--IIS Local Server-->
<widgets:StackPanelWithSpacing SpaceBetweenItems="5">
<RadioButton
IsChecked="False"
GroupName="WebProject"
x:Name="UseLocalIIS"
Click="UseLocalIIS_Click"
Content="{core:Localize ICSharpCode.WepProjectOptionsPanel.UseLocalIIS}" />
<Grid Margin="10, 10"
IsEnabled="False"
x:Name="LocalIISGroup"
VerticalAlignment="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock
VerticalAlignment="Center"
Grid.Row="1"
TextWrapping="Wrap"
Text="{core:Localize ICSharpCode.WepProjectOptionsPanel.ProjectUrl}" />
<TextBox
Grid.Row="1"
Grid.Column="1"
x:Name="ProjectUrl"
TextChanged="ProjectUrl_TextChanged"
MinWidth="250" />
<Button
Grid.Row="1"
Grid.Column="2"
Style="{x:Static core:GlobalStyles.ButtonStyle}"
Name="CreateVirtualDirectoryButton"
Content="{core:Localize ICSharpCode.WepProjectOptionsPanel.CreateVirtualDir}"
Click="CreateVirtualDirectory_Click" />
</Grid>
<TextBlock
Foreground="Red"
TextDecorations="Underline"
FontSize="12"
FontWeight="Bold"
TextWrapping="Wrap"
Name="StatusLabel" />
</widgets:StackPanelWithSpacing>
</widgets:StackPanelWithSpacing>
</GroupBox>
</StackPanel>
</UserControl>

131
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/WebProjectOptions/WebProjectOptionsPanel.xaml.cs

@ -0,0 +1,131 @@ @@ -0,0 +1,131 @@
// 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.IO;
using System.Windows;
using System.Windows.Controls;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
{
public partial class WebProjectOptionsPanel : UserControl
{
private readonly DebugOptions parentPanel;
public WebProjectOptionsPanel(DebugOptions parentPanel)
{
InitializeComponent();
this.parentPanel = parentPanel;
if (CurrentProjectDebugData == null)
CurrentProjectDebugData = new WebProjectDebugData();
Loaded += delegate(object sender, RoutedEventArgs e) {
switch (CurrentProjectDebugData.WebServer)
{
case WebServer.IISExpress:
UseIISExpress.IsChecked = true;
UseIISExpress_Click(null, null);
break;
case WebServer.IIS:
UseLocalIIS.IsChecked = true;
ProjectUrl.Text = CurrentProjectDebugData.ProjectUrl ?? string.Empty;
UseLocalIIS_Click(null, null);
break;
default:
// do nothing
break;
}
};
}
WebProjectDebugData CurrentProjectDebugData {
get {
var data = WebProjectsOptions.Instance.GetWebProjectOptions(ProjectService.CurrentProject.Name);
if (data != null)
return data.Data;
return null;
}
set {
WebProjectOptions data;
if (value != null)
{
data = new WebProjectOptions() {
ProjectName = ProjectService.CurrentProject.Name,
Data = value
};
}
else
data = new WebProjectOptions();
WebProjectsOptions.Instance.SetWebProjectOptions(ProjectService.CurrentProject.Name, data);
}
}
void CreateVirtualDirectory_Click(object sender, RoutedEventArgs e)
{
string error = WebProjectService.CreateVirtualDirectory(ProjectService.CurrentProject.Name,
Path.GetDirectoryName(ProjectService.CurrentProject.FileName));
if (!string.IsNullOrEmpty(error))
MessageService.ShowError(error);
else {
MessageService.ShowMessage(ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.VirtualDirCreated"));
}
}
void UseIISExpress_Click(object sender, RoutedEventArgs e)
{
WebProjectDebugData data = new WebProjectDebugData();
data.WebServer = WebServer.IISExpress;
if (ProjectService.CurrentProject is CompilableProject) {
((CompilableProject)ProjectService.CurrentProject).StartAction = StartAction.Program;
parentPanel.SetStartAction(StartAction.Program);
}
LocalIISGroup.IsEnabled = false;
CurrentProjectDebugData = data;
}
void UseLocalIIS_Click(object sender, RoutedEventArgs e)
{
WebProjectDebugData data = new WebProjectDebugData();
data.WebServer = WebServer.IIS;
if (!WebProjectService.IsIISInstalled) {
StatusLabel.Text = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.IISNotFound");
ProjectUrl.Text = string.Empty;
}
else {
StatusLabel.Text = string.Empty;
ProjectUrl.Text = @"http://localhost/" + ProjectService.CurrentProject.Name;
}
data.ProjectUrl = ProjectUrl.Text;
CreateVirtualDirectoryButton.IsEnabled = WebProjectService.IsIISInstalled;
ProjectUrl.IsEnabled = WebProjectService.IsIISInstalled;
if (ProjectService.CurrentProject is CompilableProject) {
((CompilableProject)ProjectService.CurrentProject).StartAction = StartAction.Project;
parentPanel.SetStartAction(StartAction.Project);
}
LocalIISGroup.IsEnabled = true;
CurrentProjectDebugData = data;
}
void ProjectUrl_TextChanged(object sender, TextChangedEventArgs e)
{
WebProjectDebugData data = new WebProjectDebugData();
data.WebServer = WebServer.IIS;
data.ProjectUrl = ProjectUrl.Text;
CurrentProjectDebugData = data;
}
}
}

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

@ -11,6 +11,7 @@ using System.IO; @@ -11,6 +11,7 @@ using System.IO;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Gui.OptionPanels;
namespace ICSharpCode.SharpDevelop.Project
{
@ -78,6 +79,11 @@ namespace ICSharpCode.SharpDevelop.Project @@ -78,6 +79,11 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
properties.Set("files", files.ToArray());
var webOptions = WebProjectsOptions.Instance.GetWebProjectOptions(Name);
if (webOptions != null)
properties.Set("WebProjectOptions", webOptions);
return properties;
}
@ -91,6 +97,8 @@ namespace ICSharpCode.SharpDevelop.Project @@ -91,6 +97,8 @@ namespace ICSharpCode.SharpDevelop.Project
foreach (string fileName in memento.Get("files", new string[0])) {
filesToOpenAfterSolutionLoad.Add(fileName);
}
WebProjectsOptions.Instance.SetWebProjectOptions(Name, memento.Get("WebProjectOptions", new WebProjectOptions()) as WebProjectOptions);
}
#endregion
@ -358,6 +366,13 @@ namespace ICSharpCode.SharpDevelop.Project @@ -358,6 +366,13 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
[Browsable(false)]
public virtual bool IsWebProject {
get {
return false;
}
}
public virtual void Start(bool withDebugging)
{
ProcessStartInfo psi;
@ -367,7 +382,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -367,7 +382,7 @@ namespace ICSharpCode.SharpDevelop.Project
MessageService.ShowError(ex.Message);
return;
}
if (withDebugging && !FileUtility.IsUrl(psi.FileName)) {
if (withDebugging && (!FileUtility.IsUrl(psi.FileName) || IsWebProject)) {
DebuggerService.CurrentDebugger.Start(psi);
} else {
DebuggerService.CurrentDebugger.StartWithoutDebugging(psi);

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

@ -217,6 +217,9 @@ namespace ICSharpCode.SharpDevelop.Project @@ -217,6 +217,9 @@ namespace ICSharpCode.SharpDevelop.Project
if (IsSilverlightProject) {
return TestPageFileName.Length > 0;
}
if (IsWebProject)
return true;
switch (this.StartAction) {
case StartAction.Project:
return OutputType == OutputType.Exe || OutputType == OutputType.WinExe;
@ -279,8 +282,12 @@ namespace ICSharpCode.SharpDevelop.Project @@ -279,8 +282,12 @@ namespace ICSharpCode.SharpDevelop.Project
string pagePath = "file:///" + Path.Combine(OutputFullPath, TestPageFileName);
return new ProcessStartInfo(pagePath);
}
switch (this.StartAction) {
case StartAction.Project:
if (IsWebProject)
return new ProcessStartInfo("http://localhost");
return CreateStartInfo(this.OutputAssemblyFullPath);
case StartAction.Program:
return CreateStartInfo(this.StartProgram);
@ -356,6 +363,14 @@ namespace ICSharpCode.SharpDevelop.Project @@ -356,6 +363,14 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
[Browsable(false)]
public override bool IsWebProject {
get {
string guids = GetEvaluatedProperty("ProjectTypeGuids") ?? "";
return guids.Contains("349c5851-65df-11da-9384-00065b846f21");
}
}
[Browsable(false)]
public string TestPageFileName {
get {

145
src/Main/Base/Project/Src/Services/WebProjectService/WebProjectService.cs

@ -0,0 +1,145 @@ @@ -0,0 +1,145 @@
// 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.EnterpriseServices.Internal;
using ICSharpCode.Core;
using Microsoft.Win32;
namespace ICSharpCode.SharpDevelop.Project
{
public enum IISVersion
{
IIS5 = 5,
IIS6,
IIS7,
IIS_Future
}
public enum WebServer
{
None,
IISExpress,
IIS
}
/// <summary>
/// Exposes common operations used in Web Projects
/// </summary>
public static class WebProjectService
{
const string IIS_REG_KEY_NAME = "Software\\Microsoft\\InetStp";
const string IIS_REG_KEY_VALUE = "MajorVersion";
const string DEFAULT_WEB_SITE = "Default Web Site";
const string IIS_LOCATION = "IIS://localhost/W3SVC/1/Root";
/// <summary>
/// Gets the IIS worker process name.
/// </summary>
public static string WorkerProcessName {
get {
if (!IsIISInstalled)
return ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.IISNotFound");
try {
string name;
switch(IISVersion)
{
case IISVersion.IIS5:
name = "aspnet_wp";
break;
default:
name = "w3wp";
break;
}
return name;
}
catch (Exception ex) {
return ex.Message;
}
}
}
/// <summary>
/// Gets a value representing whether IIS is installed.
/// </summary>
public static bool IsIISInstalled {
get {
return (int)IISVersion > 4;
}
}
/// <summary>
/// Gets a value representing IIS version.
/// </summary>
public static IISVersion IISVersion
{
get {
int regValue = 0;
RegistryService.GetRegistryValue<int>(
RegistryHive.LocalMachine,
IIS_REG_KEY_NAME,
IIS_REG_KEY_VALUE,
RegistryValueKind.DWord,
out regValue);
return (IISVersion)regValue;
}
}
/// <summary>
/// Creates a virtual directory in IIS.
/// </summary>
/// <param name="virtualDirectoryName">Virtual directory name.</param>
/// <param name="virtualDirectoryPath">Physical path.</param>
/// <returns></returns>
public static string CreateVirtualDirectory(string virtualDirectoryName, string physicalDirectoryPath)
{
try {
if (!IsIISInstalled)
return ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.IISNotFound");
string error;
switch(IISVersion)
{
case IISVersion.IIS5:
case IISVersion.IIS6:
var vr = new IISVirtualRoot();
vr.Create(IIS_LOCATION,
physicalDirectoryPath,
virtualDirectoryName,
out error);
break;
default:
using (var manager = new Microsoft.Web.Administration.ServerManager())
{
string name = "/" + virtualDirectoryName;
if (manager.Sites[DEFAULT_WEB_SITE] != null) {
if (manager.Sites[DEFAULT_WEB_SITE].Applications[name] == null) {
manager.Sites[DEFAULT_WEB_SITE].Applications.Add(name, physicalDirectoryPath);
manager.CommitChanges();
error = string.Empty;
} else {
error = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.ApplicationExists");
}
}
else
error = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.MultipleIISServers");
}
break;
}
return error;
}
catch (Exception ex) {
return ex.Message;
}
}
}
}

2
src/Main/Core/Project/ICSharpCode.Core.csproj

@ -104,6 +104,7 @@ @@ -104,6 +104,7 @@
<Compile Include="Src\Services\PropertyService\Properties.cs" />
<Compile Include="Src\Services\PropertyService\PropertyChangedEvent.cs" />
<Compile Include="Src\Services\PropertyService\PropertyService.cs" />
<Compile Include="Src\Services\RegistryService\RegistryService.cs" />
<Compile Include="Src\Services\ResourceService\ResourceNotFoundException.cs" />
<Compile Include="Src\Services\ResourceService\ResourceService.cs" />
<Compile Include="Src\Services\ServiceManager.cs" />
@ -132,6 +133,7 @@ @@ -132,6 +133,7 @@
<ItemGroup>
<Folder Include="Src\Services\LoggingService" />
<Folder Include="Src\Services\AnalyticsMonitor" />
<Folder Include="Src\Services\RegistryService" />
<Folder Include="Src\Services\ResourceService" />
<Content Include="..\..\..\..\data\schemas\AddIn.xsd">
<Link>Src\AddInTree\AddIn\AddIn.xsd</Link>

58
src/Main/Core/Project/Src/Services/RegistryService/RegistryService.cs

@ -0,0 +1,58 @@ @@ -0,0 +1,58 @@
// 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.Globalization;
using Microsoft.Win32;
namespace ICSharpCode.Core
{
/// <summary>
/// RegistryService.
/// </summary>
public static class RegistryService
{
/// <summary>
/// Gets the registry value.
/// </summary>
/// <param name="hive">Registry hive.</param>
/// <param name="key">Registry key.</param>
/// <param name="value">Registry value.</param>
/// <param name="kind">Registry kind.</param>
/// <param name="data">Data.</param>
/// <returns>True, if the data was found, False otherwise.</returns>
public static bool GetRegistryValue<T>(RegistryHive hive, string key, string value, RegistryValueKind kind, out T data)
{
data = default(T);
try {
using (RegistryKey baseKey = RegistryKey.OpenRemoteBaseKey(hive, String.Empty))
{
if (baseKey != null)
{
using (RegistryKey registryKey = baseKey.OpenSubKey(key, RegistryKeyPermissionCheck.ReadSubTree))
{
if (registryKey != null)
{
RegistryValueKind kindFound = registryKey.GetValueKind(value);
if (kindFound == kind)
{
object regValue = registryKey.GetValue(value, null);
if (regValue != null)
{
data = (T)Convert.ChangeType(regValue, typeof(T), CultureInfo.InvariantCulture);
return true;
}
}
}
}
}
}
return false;
} catch {
return false;
}
}
}
}
Loading…
Cancel
Save