Browse Source

support IIS Express

pull/15/head
Eusebiu Marcu 15 years ago
parent
commit
f51a45646d
  1. 14
      data/resources/StringResources.resx
  2. 37
      src/AddIns/Debugger/Debugger.AddIn/Service/WindowsDebugger.cs
  3. 2
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  4. 10
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/DebugOptions.cs
  5. 3
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/WebProjectOptions/WebProjectOptions.cs
  6. 54
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/WebProjectOptions/WebProjectOptionsPanel.xaml
  7. 90
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/WebProjectOptions/WebProjectOptionsPanel.xaml.cs
  8. 61
      src/Main/Base/Project/Src/Services/WebProjectService/WebProjectService.cs

14
data/resources/StringResources.resx

@ -3756,13 +3756,13 @@ You can also choose to store the setting in the .user-file instead of the projec
<value>Web Server</value> <value>Web Server</value>
</data> </data>
<data name="ICSharpCode.WepProjectOptionsPanel.CreateVirtualDir" xml:space="preserve"> <data name="ICSharpCode.WepProjectOptionsPanel.CreateVirtualDir" xml:space="preserve">
<value>Create virtual directory</value> <value>Create application/virtual directory</value>
</data> </data>
<data name="ICSharpCode.WepProjectOptionsPanel.IISNotFound" xml:space="preserve"> <data name="ICSharpCode.WepProjectOptionsPanel.IISNotFound" xml:space="preserve">
<value>IIS was not found</value> <value>Local IIS or IIS Express was not found.</value>
</data> </data>
<data name="ICSharpCode.WepProjectOptionsPanel.VirtualDirCreated" xml:space="preserve"> <data name="ICSharpCode.WepProjectOptionsPanel.VirtualDirCreated" xml:space="preserve">
<value>Virtual directory was created</value> <value>Application/virtual directory was created.</value>
</data> </data>
<data name="ICSharpCode.WepProjectOptionsPanel.ProjectUrl" xml:space="preserve"> <data name="ICSharpCode.WepProjectOptionsPanel.ProjectUrl" xml:space="preserve">
<value>Project Url:</value> <value>Project Url:</value>
@ -3771,7 +3771,7 @@ You can also choose to store the setting in the .user-file instead of the projec
<value>Use local IIS Web server</value> <value>Use local IIS Web server</value>
</data> </data>
<data name="ICSharpCode.WepProjectOptionsPanel.UseIISExpress" xml:space="preserve"> <data name="ICSharpCode.WepProjectOptionsPanel.UseIISExpress" xml:space="preserve">
<value>Use local IIS Express Web server</value> <value>Use IIS Express Web server</value>
</data> </data>
<data name="ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction" xml:space="preserve"> <data name="ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction" xml:space="preserve">
<value>There's no Project Url specified or external program. Check the web server at Project Properties -&gt; Debug tab.</value> <value>There's no Project Url specified or external program. Check the web server at Project Properties -&gt; Debug tab.</value>
@ -3785,6 +3785,12 @@ You can also choose to store the setting in the .user-file instead of the projec
<data name="ICSharpCode.WepProjectOptionsPanel.UnableToAttach" xml:space="preserve"> <data name="ICSharpCode.WepProjectOptionsPanel.UnableToAttach" xml:space="preserve">
<value>Debugger was unable to attach to process.</value> <value>Debugger was unable to attach to process.</value>
</data> </data>
<data name="ICSharpCode.WepProjectOptionsPanel.DisableWebServerButton" xml:space="preserve">
<value>Disable web server options</value>
</data>
<data name="ICSharpCode.WepProjectOptionsPanel.Port" xml:space="preserve">
<value>Server port:</value>
</data>
<data name="ICSharpCode.NoStartupProject" xml:space="preserve"> <data name="ICSharpCode.NoStartupProject" xml:space="preserve">
<value>There is no startup project to debug.</value> <value>There is no startup project to debug.</value>
</data> </data>

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

@ -156,33 +156,30 @@ namespace ICSharpCode.SharpDevelop.Services
if (debugData.Data.WebServer != WebServer.None) { if (debugData.Data.WebServer != WebServer.None) {
// try attach to IIS WP System.Diagnostics.Process defaultAppProcess = null;
var processes = System.Diagnostics.Process.GetProcesses();
string processName = WebProjectService.WorkerProcessName;
if (debugData.Data.WebServer == WebServer.IISExpress)
processName = WebProjectService.IIS_EXPRESS_PROCESS_NAME;
System.Diagnostics.Process localProcess = null; string processName = WebProjectService.WorkerProcessName;
// try find the worker process // try find the worker process directly or using the process monitor callback
int index = processes.FindIndex<System.Diagnostics.Process>( var processes = System.Diagnostics.Process.GetProcesses();
p => p.ProcessName.IndexOf(processName, StringComparison.OrdinalIgnoreCase) == 0); int index = processes.FindIndex(p => p.ProcessName.Equals(processName, StringComparison.OrdinalIgnoreCase));
if (index > -1){ if (index > -1){
Attach(processes[index]); Attach(processes[index]);
} else { } else {
this.monitor = new ProcessMonitor(processName); this.monitor = new ProcessMonitor(processName);
this.monitor.ProcessCreated += delegate { this.monitor.ProcessCreated += delegate {
if (attached)
return;
processes = System.Diagnostics.Process.GetProcesses(); processes = System.Diagnostics.Process.GetProcesses();
index = processes.FindIndex<System.Diagnostics.Process>( index = processes.FindIndex(p => p.ProcessName.Equals(processName, StringComparison.OrdinalIgnoreCase));
p => p.ProcessName.IndexOf(processName, StringComparison.OrdinalIgnoreCase) == 0); WorkbenchSingleton.SafeThreadCall((Action)(() => Attach(processes[index])));
Attach(processes[index]);
if (!attached) { if (!attached) {
if(debugData.Data.WebServer == WebServer.IIS) { if(debugData.Data.WebServer == WebServer.IIS) {
string format = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.NoIISWP"); string format = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.NoIISWP");
MessageService.ShowMessage(string.Format(format, processName)); MessageService.ShowMessage(string.Format(format, processName));
} else { } else {
Attach(localProcess); WorkbenchSingleton.SafeThreadCall((Action)(() => Attach(defaultAppProcess)));
if (!attached) { if (!attached) {
MessageService.ShowMessage(ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.UnableToAttach")); MessageService.ShowMessage(ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.UnableToAttach"));
} }
@ -192,15 +189,23 @@ namespace ICSharpCode.SharpDevelop.Services
this.monitor.Start(); this.monitor.Start();
} }
if (debugData.Data.WebServer == WebServer.IISExpress) {
// start IIS express and attach to it
if (WebProjectService.IISVersion == IISVersion.IISExpress)
System.Diagnostics.Process.Start(WebProjectService.IIS_EXPRESS_PROCESS_LOCATION);
else
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
}
// start default application(e.g. browser) // start default application(e.g. browser)
if (project.StartAction == StartAction.StartURL) if (project.StartAction == StartAction.StartURL)
localProcess = System.Diagnostics.Process.Start(processStartInfo.FileName); defaultAppProcess = System.Diagnostics.Process.Start(processStartInfo.FileName);
else { else {
if (!string.IsNullOrEmpty(debugData.Data.ProjectUrl) && debugData.Data.WebServer == WebServer.IIS) if (!string.IsNullOrEmpty(debugData.Data.ProjectUrl) && debugData.Data.WebServer == WebServer.IIS)
localProcess = System.Diagnostics.Process.Start(debugData.Data.ProjectUrl); defaultAppProcess = System.Diagnostics.Process.Start(debugData.Data.ProjectUrl);
else { else {
if (debugData.Data.WebServer == WebServer.IISExpress) if (debugData.Data.WebServer == WebServer.IISExpress)
localProcess = System.Diagnostics.Process.Start(debugData.Data.ProjectUrl); defaultAppProcess = System.Diagnostics.Process.Start(debugData.Data.ProjectUrl);
} }
} }
} }

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

@ -44,7 +44,7 @@
<DefineConstants>TRACE;PUBLICINTERPROCESS</DefineConstants> <DefineConstants>TRACE;PUBLICINTERPROCESS</DefineConstants>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.Web.Administration" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="Mono.Cecil"> <Reference Include="Mono.Cecil">
<HintPath>..\..\..\Libraries\Mono.Cecil\Mono.Cecil.dll</HintPath> <HintPath>..\..\..\Libraries\Mono.Cecil\Mono.Cecil.dll</HintPath>
<Private>False</Private> <Private>False</Private>

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

@ -61,7 +61,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
if (isWebProject) { if (isWebProject) {
ElementHost host = new ElementHost(); ElementHost host = new ElementHost();
host.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right; host.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right;
host.Height = 150; host.Height = 175;
host.Width = 550; host.Width = 550;
host.Top = 240; host.Top = 240;
host.Left = 8; host.Left = 8;
@ -95,5 +95,13 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
UpdateEnabledStates(null, EventArgs.Empty); UpdateEnabledStates(null, EventArgs.Empty);
} }
public void SetExternalProgram(string externalProgram)
{
if (externalProgram == null)
return;
Get<TextBox>("startExternalProgram").Text = externalProgram;
}
} }
} }

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

@ -64,5 +64,8 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
[DefaultValue(WebServer.None)] [DefaultValue(WebServer.None)]
public WebServer WebServer { get; set; } public WebServer WebServer { get; set; }
[DefaultValue("8080")]
public string Port { get; set; }
} }
} }

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

@ -4,32 +4,42 @@
> >
<GroupBox Margin="0, 0, 85, 0" <GroupBox Margin="0, 0, 85, 0"
Header="{core:Localize ICSharpCode.WepProjectOptionsPanel.Server}"> Header="{core:Localize ICSharpCode.WepProjectOptionsPanel.Server}">
<widgets:StackPanelWithSpacing SpaceBetweenItems="5"> <widgets:StackPanelWithSpacing SpaceBetweenItems="3">
<!--IIS Express--> <!--IIS Express-->
<widgets:StackPanelWithSpacing SpaceBetweenItems="5"> <widgets:StackPanelWithSpacing SpaceBetweenItems="3">
<RadioButton <RadioButton
IsChecked="False" IsChecked="False"
GroupName="WebProject" GroupName="WebProject"
x:Name="UseIISExpress" x:Name="UseIISExpress"
Click="UseIISExpress_Click" Click="UseIISExpress_Click"
Content="{core:Localize ICSharpCode.WepProjectOptionsPanel.UseIISExpress}" /> Content="{core:Localize ICSharpCode.WepProjectOptionsPanel.UseIISExpress}" />
<Grid Margin="10, 3"
IsEnabled="False"
x:Name="IISExpressGroup"
VerticalAlignment="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{core:Localize ICSharpCode.WepProjectOptionsPanel.Port}"/>
<TextBox Grid.Column="1" x:Name="PortTextBox" PreviewTextInput="PortTextBox_PreviewTextInput" Text="8080"/>
</Grid>
</widgets:StackPanelWithSpacing> </widgets:StackPanelWithSpacing>
<!--IIS Local Server--> <!--IIS Local Server-->
<widgets:StackPanelWithSpacing SpaceBetweenItems="5"> <widgets:StackPanelWithSpacing SpaceBetweenItems="3">
<RadioButton <RadioButton
IsChecked="False" IsChecked="False"
GroupName="WebProject" GroupName="WebProject"
x:Name="UseLocalIIS" x:Name="UseLocalIIS"
Click="UseLocalIIS_Click" Click="UseLocalIIS_Click"
Content="{core:Localize ICSharpCode.WepProjectOptionsPanel.UseLocalIIS}" /> Content="{core:Localize ICSharpCode.WepProjectOptionsPanel.UseLocalIIS}" />
<Grid Margin="10, 10" <Grid Margin="10, 3"
IsEnabled="False" IsEnabled="False"
x:Name="LocalIISGroup" x:Name="LocalIISGroup"
VerticalAlignment="Top"> VerticalAlignment="Top">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock <TextBlock
VerticalAlignment="Center" VerticalAlignment="Center"
@ -42,22 +52,28 @@
x:Name="ProjectUrl" x:Name="ProjectUrl"
TextChanged="ProjectUrl_TextChanged" TextChanged="ProjectUrl_TextChanged"
MinWidth="250" /> 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> </Grid>
<TextBlock
Foreground="Red"
TextDecorations="Underline"
FontSize="12"
FontWeight="Bold"
TextWrapping="Wrap"
Name="StatusLabel" />
</widgets:StackPanelWithSpacing> </widgets:StackPanelWithSpacing>
<TextBlock
Foreground="Red"
TextDecorations="Underline"
FontSize="12"
FontWeight="Bold"
TextWrapping="Wrap"
Name="StatusLabel" />
<widgets:UniformGridWithSpacing Columns="2" SpaceBetweenColumns="10">
<Button
IsEnabled="False"
Style="{x:Static core:GlobalStyles.ButtonStyle}"
Name="CreateVirtualDirectoryButton"
Content="{core:Localize ICSharpCode.WepProjectOptionsPanel.CreateVirtualDir}"
Click="CreateVirtualDirectory_Click" />
<Button
Style="{x:Static core:GlobalStyles.ButtonStyle}"
Name="ClearWebServerButton"
Content="{core:Localize ICSharpCode.WepProjectOptionsPanel.DisableWebServerButton}"
Click="ClearWebServerButton_Click" />
</widgets:UniformGridWithSpacing>
</widgets:StackPanelWithSpacing> </widgets:StackPanelWithSpacing>
</GroupBox> </GroupBox>
</UserControl> </UserControl>

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

@ -25,16 +25,32 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
CurrentProjectDebugData = new WebProjectDebugData(); CurrentProjectDebugData = new WebProjectDebugData();
Loaded += delegate(object sender, RoutedEventArgs e) { Loaded += delegate(object sender, RoutedEventArgs e) {
if (!WebProjectService.IsIISInstalled) {
StatusLabel.Text = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.IISNotFound");
return;
}
switch (CurrentProjectDebugData.WebServer) switch (CurrentProjectDebugData.WebServer)
{ {
case WebServer.IISExpress: case WebServer.IISExpress:
UseIISExpress.IsChecked = true; if (WebProjectService.IISVersion == IISVersion.IISExpress) {
UseIISExpress_Click(null, null); UseIISExpress.IsChecked = true;
IISExpressGroup.IsEnabled = true;
CreateVirtualDirectoryButton.IsEnabled = true;
PortTextBox.Text = CurrentProjectDebugData.Port;
}
break; break;
case WebServer.IIS: case WebServer.IIS:
UseLocalIIS.IsChecked = true; if (WebProjectService.IISVersion == IISVersion.IIS5 ||
ProjectUrl.Text = CurrentProjectDebugData.ProjectUrl ?? string.Empty; WebProjectService.IISVersion == IISVersion.IIS6 ||
UseLocalIIS_Click(null, null); WebProjectService.IISVersion == IISVersion.IIS7 ||
WebProjectService.IISVersion == IISVersion.IIS_Future) {
UseLocalIIS.IsChecked = true;
LocalIISGroup.IsEnabled = true;
CreateVirtualDirectoryButton.IsEnabled = true;
ProjectUrl.Text = CurrentProjectDebugData.ProjectUrl ?? string.Empty;
}
break; break;
default: default:
// do nothing // do nothing
@ -83,12 +99,20 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
{ {
WebProjectDebugData data = new WebProjectDebugData(); WebProjectDebugData data = new WebProjectDebugData();
data.WebServer = WebServer.IISExpress; data.WebServer = WebServer.IISExpress;
data.Port = PortTextBox.Text;
data.ProjectUrl = string.Format(@"http://localhost:{0}/" + ProjectService.CurrentProject.Name, PortTextBox.Text);
bool isIISExpressInstalled = WebProjectService.IISVersion == IISVersion.IISExpress;
if (ProjectService.CurrentProject is CompilableProject) { if (!isIISExpressInstalled) {
((CompilableProject)ProjectService.CurrentProject).StartAction = StartAction.Program; UseIISExpress.IsChecked = false;
parentPanel.SetStartAction(StartAction.Program); data.WebServer = WebServer.None;
StatusLabel.Text = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.IISNotFound");
data.ProjectUrl = string.Empty;
} }
else
StatusLabel.Text = string.Empty;
IISExpressGroup.IsEnabled = CreateVirtualDirectoryButton.IsEnabled = isIISExpressInstalled;
LocalIISGroup.IsEnabled = false; LocalIISGroup.IsEnabled = false;
CurrentProjectDebugData = data; CurrentProjectDebugData = data;
} }
@ -97,11 +121,16 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
{ {
WebProjectDebugData data = new WebProjectDebugData(); WebProjectDebugData data = new WebProjectDebugData();
data.WebServer = WebServer.IIS; data.WebServer = WebServer.IIS;
data.Port = string.Empty;
bool isIISInstalled = WebProjectService.IISVersion == IISVersion.IIS5 ||
WebProjectService.IISVersion == IISVersion.IIS6 ||
WebProjectService.IISVersion == IISVersion.IIS7;
if (!WebProjectService.IsIISInstalled) { if (!isIISInstalled) {
StatusLabel.Text = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.IISNotFound"); StatusLabel.Text = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.IISNotFound");
ProjectUrl.Text = string.Empty; ProjectUrl.Text = string.Empty;
data.WebServer = WebServer.None; data.WebServer = WebServer.None;
UseLocalIIS.IsChecked = false;
} }
else { else {
StatusLabel.Text = string.Empty; StatusLabel.Text = string.Empty;
@ -109,15 +138,8 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
} }
data.ProjectUrl = ProjectUrl.Text; data.ProjectUrl = ProjectUrl.Text;
CreateVirtualDirectoryButton.IsEnabled = WebProjectService.IsIISInstalled; LocalIISGroup.IsEnabled = CreateVirtualDirectoryButton.IsEnabled = isIISInstalled;
ProjectUrl.IsEnabled = WebProjectService.IsIISInstalled; IISExpressGroup.IsEnabled = false;
if (ProjectService.CurrentProject is CompilableProject) {
((CompilableProject)ProjectService.CurrentProject).StartAction = StartAction.Project;
parentPanel.SetStartAction(StartAction.Project);
}
LocalIISGroup.IsEnabled = true;
CurrentProjectDebugData = data; CurrentProjectDebugData = data;
} }
@ -128,5 +150,37 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
data.ProjectUrl = ProjectUrl.Text; data.ProjectUrl = ProjectUrl.Text;
CurrentProjectDebugData = data; CurrentProjectDebugData = data;
} }
void ClearWebServerButton_Click(object sender, RoutedEventArgs e)
{
UseIISExpress.IsChecked = false;
UseLocalIIS.IsChecked = false;
CreateVirtualDirectoryButton.IsEnabled = false;
ProjectUrl.Text = string.Empty;
LocalIISGroup.IsEnabled = false;
IISExpressGroup.IsEnabled = false;
WebProjectDebugData data = new WebProjectDebugData();
data.WebServer = WebServer.None;
data.ProjectUrl = string.Empty;
CurrentProjectDebugData = data;
}
bool AreAllValidNumericChars(string str)
{
foreach(char c in str)
{
if(!Char.IsNumber(c)) return false;
}
return true;
}
void PortTextBox_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
{
e.Handled = !AreAllValidNumericChars(e.Text);
base.OnPreviewTextInput(e);
}
} }
} }

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

@ -3,6 +3,9 @@
using System; using System;
using System.EnterpriseServices.Internal; using System.EnterpriseServices.Internal;
using System.IO;
using System.Reflection;
using ICSharpCode.Core; using ICSharpCode.Core;
using Microsoft.Win32; using Microsoft.Win32;
@ -10,6 +13,7 @@ namespace ICSharpCode.SharpDevelop.Project
{ {
public enum IISVersion public enum IISVersion
{ {
None = 0,
IIS5 = 5, IIS5 = 5,
IIS6, IIS6,
IIS7, IIS7,
@ -46,6 +50,8 @@ namespace ICSharpCode.SharpDevelop.Project
public const string IIS_5_PROCESS_NAME = "aspnet_wp"; public const string IIS_5_PROCESS_NAME = "aspnet_wp";
public const string IIS_NEW_PROCESS_NAME = "w3wp"; public const string IIS_NEW_PROCESS_NAME = "w3wp";
public const string IIS_EXPRESS_PROCESS_LOCATION = @"C:\Program Files\IIS Express\iisexpress.exe";
/// <summary> /// <summary>
/// Gets the IIS worker process name. /// Gets the IIS worker process name.
/// </summary> /// </summary>
@ -149,12 +155,18 @@ namespace ICSharpCode.SharpDevelop.Project
RegistryValueKind.DWord, RegistryValueKind.DWord,
out regValue); out regValue);
return (IISVersion)regValue; if (regValue > 4)
return (IISVersion)regValue;
if (File.Exists(WebProjectService.IIS_EXPRESS_PROCESS_LOCATION))
return IISVersion.IISExpress;
return IISVersion.None;
} }
} }
/// <summary> /// <summary>
/// Creates a virtual directory in IIS. /// Creates a virtual directory in local IIS or IIS Express.
/// </summary> /// </summary>
/// <param name="virtualDirectoryName">Virtual directory name.</param> /// <param name="virtualDirectoryName">Virtual directory name.</param>
/// <param name="virtualDirectoryPath">Physical path.</param> /// <param name="virtualDirectoryPath">Physical path.</param>
@ -179,21 +191,40 @@ namespace ICSharpCode.SharpDevelop.Project
break; break;
default: default:
using (var manager = new Microsoft.Web.Administration.ServerManager()) // TODO: find a better way to create IIS 7 applications without Microsoft.Web.Administration.ServerManager
{ string name = "/" + virtualDirectoryName;
if (manager.Sites[DEFAULT_WEB_SITE] != null) { // load from GAC - IIS7 is installed
string name = "/" + virtualDirectoryName; Assembly webAdministrationAssembly;
if (manager.Sites[DEFAULT_WEB_SITE].Applications[name] == null) { try {
manager.Sites[DEFAULT_WEB_SITE].Applications.Add(name, physicalDirectoryPath); // iis 7
manager.CommitChanges(); webAdministrationAssembly = Assembly.Load("Microsoft.Web.Administration, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
error = string.Empty; }
} else { catch {
error = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.ApplicationExists"); // iis express
} webAdministrationAssembly = Assembly.Load("Microsoft.Web.Administration, Version=7.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
}
// use dynamic because classic reflection is way TOO ugly
dynamic manager = webAdministrationAssembly.CreateInstance("Microsoft.Web.Administration.ServerManager");
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 {
if (manager.Sites[0].Applications[name] == null) {
manager.Sites[0].Applications.Add(name, physicalDirectoryPath);
manager.CommitChanges();
error = string.Empty;
} else {
error = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.ApplicationExists");
} }
else
error = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.MultipleIISServers");
} }
manager.Dispose();
break; break;
} }

Loading…
Cancel
Save