Browse Source

Support running a web project with either IIS Express or IIS when both are installed.

pull/18/head
Matt Ward 14 years ago
parent
commit
72a2e21ae4
  1. 18
      src/AddIns/Debugger/Debugger.AddIn/Service/WindowsDebugger.cs
  2. 18
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/WebProjectOptions/WebProjectOptionsPanel.xaml.cs
  3. 7
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SpecialFileNodeCommands.cs
  4. 196
      src/Main/Base/Project/Src/Services/WebProjectService/WebProjectService.cs

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

@ -150,10 +150,10 @@ namespace ICSharpCode.SharpDevelop.Services @@ -150,10 +150,10 @@ namespace ICSharpCode.SharpDevelop.Services
// we deal with a WebProject
try {
var project = ProjectService.OpenSolution.StartupProject as CompilableProject;
var options = WebProjectsOptions.Instance.GetWebProjectOptions(project.Name);
WebProjectOptions options = WebProjectsOptions.Instance.GetWebProjectOptions(project.Name);
System.Diagnostics.Process defaultAppProcess = null;
string processName = WebProjectService.WorkerProcessName;
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();
@ -169,7 +169,7 @@ namespace ICSharpCode.SharpDevelop.Services @@ -169,7 +169,7 @@ namespace ICSharpCode.SharpDevelop.Services
if (options.Data.WebServer == WebServer.IISExpress) {
// start IIS express and attach to it
if (WebProjectService.IISVersion == IISVersion.IISExpress) {
if (WebProjectService.IsIISExpressInstalled) {
System.Diagnostics.Process.Start(WebProjectService.IISExpressProcessLocation);
} else {
DisposeProcessMonitor();
@ -333,13 +333,13 @@ namespace ICSharpCode.SharpDevelop.Services @@ -333,13 +333,13 @@ namespace ICSharpCode.SharpDevelop.Services
// we deal with a WebProject
try {
var project = ProjectService.OpenSolution.StartupProject as CompilableProject;
var options = WebProjectsOptions.Instance.GetWebProjectOptions(project.Name);
WebProjectOptions options = WebProjectsOptions.Instance.GetWebProjectOptions(project.Name);
string processName = WebProjectService.WorkerProcessName;
string processName = WebProjectService.GetWorkerProcessName(options.Data.WebServer);
if (options.Data.WebServer == WebServer.IISExpress) {
// start IIS express
if (WebProjectService.IISVersion == IISVersion.IISExpress)
if (WebProjectService.IsIISExpressInstalled)
System.Diagnostics.Process.Start(WebProjectService.IISExpressProcessLocation);
else {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}");
@ -437,11 +437,11 @@ namespace ICSharpCode.SharpDevelop.Services @@ -437,11 +437,11 @@ namespace ICSharpCode.SharpDevelop.Services
return true;
}
void OnProcessCreated(System.Diagnostics.Process defaultAppProcess, WebProjectOptions debugData)
void OnProcessCreated(System.Diagnostics.Process defaultAppProcess, WebProjectOptions options)
{
if (attached)
return;
string processName = WebProjectService.WorkerProcessName;
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)
@ -449,7 +449,7 @@ namespace ICSharpCode.SharpDevelop.Services @@ -449,7 +449,7 @@ namespace ICSharpCode.SharpDevelop.Services
Attach(processes[index]);
if (!attached) {
if(debugData.Data.WebServer == WebServer.IIS) {
if(options.Data.WebServer == WebServer.IIS) {
string format = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.NoIISWP");
MessageService.ShowMessage(string.Format(format, processName));
} else {

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

@ -41,7 +41,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -41,7 +41,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
void OnLoaded(object sender, RoutedEventArgs e)
{
if (!WebProjectService.IsIISInstalled) {
if (!WebProjectService.IsIISOrIISExpressInstalled) {
StatusLabel.Text = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.IISNotFound");
return;
}
@ -49,7 +49,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -49,7 +49,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
switch (CurrentProjectDebugData.WebServer)
{
case WebServer.IISExpress:
if (WebProjectService.IISVersion == IISVersion.IISExpress) {
if (WebProjectService.IsIISExpressInstalled) {
UseIISExpress.IsChecked = true;
PortTextBox.Text = CurrentProjectDebugData.Port ?? "8080";
@ -57,8 +57,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -57,8 +57,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
}
break;
case WebServer.IIS:
if (WebProjectService.IISVersion != IISVersion.IISExpress &&
WebProjectService.IISVersion != IISVersion.None) {
if (WebProjectService.IISVersion != IISVersion.None) {
UseLocalIIS.IsChecked = true;
ProjectUrl.Text = CurrentProjectDebugData.ProjectUrl ?? string.Empty;
@ -97,8 +96,10 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -97,8 +96,10 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
void CreateVirtualDirectory_Click(object sender, RoutedEventArgs e)
{
string error = WebProjectService.CreateVirtualDirectory(ProjectService.CurrentProject.Name,
Path.GetDirectoryName(ProjectService.CurrentProject.FileName));
string error = WebProjectService.CreateVirtualDirectory(
CurrentProjectDebugData.WebServer,
ProjectService.CurrentProject.Name,
Path.GetDirectoryName(ProjectService.CurrentProject.FileName));
if (!string.IsNullOrEmpty(error))
MessageService.ShowError(error);
@ -118,7 +119,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -118,7 +119,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
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;
bool isIISExpressInstalled = WebProjectService.IsIISExpressInstalled;
if (!isIISExpressInstalled) {
UseIISExpress.IsChecked = false;
@ -144,8 +145,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -144,8 +145,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
WebProjectDebugData data = new WebProjectDebugData();
data.WebServer = WebServer.IIS;
data.Port = string.Empty;
bool isIISInstalled = WebProjectService.IISVersion != IISVersion.IISExpress &&
WebProjectService.IISVersion != IISVersion.None;
bool isIISInstalled = WebProjectService.IISVersion != IISVersion.None;
if (!isIISInstalled) {
StatusLabel.Text = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.IISNotFound");

7
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SpecialFileNodeCommands.cs

@ -29,7 +29,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -29,7 +29,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
return;
}
if (!WebProjectService.IsIISInstalled) {
if (!WebProjectService.IsIISOrIISExpressInstalled) {
MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.IISNotFound}");
return;
}
@ -43,11 +43,11 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -43,11 +43,11 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
// set web server options
string projectName = project.Name;
var existingOptions = WebProjectsOptions.Instance.GetWebProjectOptions(projectName);
WebProjectOptions existingOptions = WebProjectsOptions.Instance.GetWebProjectOptions(projectName);
var options = new WebProjectOptions {
Data = new WebProjectDebugData {
WebServer = WebProjectService.IISVersion == IISVersion.IISExpress ? WebServer.IISExpress : WebServer.IIS,
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)
},
@ -63,6 +63,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -63,6 +63,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
// create virtual directory
string error = WebProjectService.CreateVirtualDirectory(
options.Data.WebServer,
projectName,
Path.GetDirectoryName(ProjectService.CurrentProject.FileName));
LoggingService.Info(error ?? string.Empty);

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

@ -15,7 +15,6 @@ namespace ICSharpCode.SharpDevelop.Project @@ -15,7 +15,6 @@ namespace ICSharpCode.SharpDevelop.Project
public enum IISVersion
{
None = 0,
IISExpress = 4,
IIS5 = 5,
IIS6,
IIS7,
@ -76,89 +75,116 @@ namespace ICSharpCode.SharpDevelop.Project @@ -76,89 +75,116 @@ namespace ICSharpCode.SharpDevelop.Project
/// <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 = IIS_5_PROCESS_NAME;
break;
case IISVersion.IISExpress:
name = IIS_EXPRESS_PROCESS_NAME;
break;
default:
name = IIS_NEW_PROCESS_NAME;
break;
}
return name;
}
catch (Exception ex) {
return ex.Message;
public static string GetWorkerProcessName(WebServer webServer)
{
if (webServer == WebServer.IISExpress) {
return GetIISExpressWorkerProcessName();
}
return GetIISWorkerProcessName();
}
public static string GetIISExpressWorkerProcessName()
{
if (!IsIISExpressInstalled)
return ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.IISNotFound");
return IIS_EXPRESS_PROCESS_NAME;
}
public static string GetIISWorkerProcessName()
{
if (!IsIISInstalled)
return ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.IISNotFound");
try {
switch (IISVersion)
{
case IISVersion.IIS5:
return IIS_5_PROCESS_NAME;
default:
return IIS_NEW_PROCESS_NAME;
}
}
catch (Exception ex) {
return ex.Message;
}
}
public static string WorkerProcessLocation {
get {
if (!IsIISInstalled)
return ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.IISNotFound");
try {
string location;
switch(IISVersion)
{
case IISVersion.IIS5:
location = FRAMEWORK_LOCATION + (Environment.Is64BitOperatingSystem ? FRAMEWORK64 : FRAMEWORK32);
string frameworkString = "";
RegistryService.GetRegistryValue<string>(
RegistryHive.LocalMachine,
ASPNET_REG_PATH,
ASPNET_ROOT_VER,
RegistryValueKind.String,
out frameworkString);
int ind = frameworkString.LastIndexOf('.');
location += "v" + frameworkString.Substring(0, ind) + "\\";
break;
default:
string regValue = "";
RegistryService.GetRegistryValue<string>(
RegistryHive.LocalMachine,
IIS_LOCATION,
IIS_INSTALL_PATH,
RegistryValueKind.String,
out regValue);
location = regValue + "\\";
break;
}
public static string GetWorkerProcessLocation(WebServer webServer)
{
if (webServer == WebServer.IISExpress) {
return GetIISExpressWorkerProcessLocation();
}
return GetIISWorkerProcessLocation();
}
public static string GetIISExpressWorkerProcessLocation()
{
if (!IsIISExpressInstalled)
return ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.IISNotFound");
return location;
}
catch (Exception ex) {
return ex.Message;
return GetDefaultIISWorkerProcessLocation();
}
public static string GetIISWorkerProcessLocation()
{
if (!IsIISInstalled)
return ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.IISNotFound");
try {
if (IISVersion == IISVersion.IIS5) {
return GetIIS5WorkerProcessLocation();
}
return GetDefaultIISWorkerProcessLocation();
}
catch (Exception ex) {
return ex.Message;
}
}
public static string GetIIS5WorkerProcessLocation()
{
string location = FRAMEWORK_LOCATION + (Environment.Is64BitOperatingSystem ? FRAMEWORK64 : FRAMEWORK32);
string frameworkString = "";
RegistryService.GetRegistryValue<string>(
RegistryHive.LocalMachine,
ASPNET_REG_PATH,
ASPNET_ROOT_VER,
RegistryValueKind.String,
out frameworkString);
int ind = frameworkString.LastIndexOf('.');
location += "v" + frameworkString.Substring(0, ind) + "\\";
return location;
}
public static string GetDefaultIISWorkerProcessLocation()
{
string regValue = "";
RegistryService.GetRegistryValue<string>(
RegistryHive.LocalMachine,
IIS_LOCATION,
IIS_INSTALL_PATH,
RegistryValueKind.String,
out regValue);
return regValue + "\\";
}
/// <summary>
/// Gets a value representing whether IIS is installed.
/// </summary>
public static bool IsIISInstalled {
get {
return (int)IISVersion >= 4;
}
get { return (int)IISVersion >= 4; }
}
public static bool IsIISExpressInstalled {
get { return File.Exists(IISExpressProcessLocation); }
}
public static bool IsIISOrIISExpressInstalled {
get { return IsIISInstalled || IsIISExpressInstalled; }
}
/// <summary>
@ -179,9 +205,6 @@ namespace ICSharpCode.SharpDevelop.Project @@ -179,9 +205,6 @@ namespace ICSharpCode.SharpDevelop.Project
if (regValue > 4)
return (IISVersion)regValue;
if (File.Exists(IISExpressProcessLocation))
return IISVersion.IISExpress;
return IISVersion.None;
}
}
@ -192,11 +215,11 @@ namespace ICSharpCode.SharpDevelop.Project @@ -192,11 +215,11 @@ namespace ICSharpCode.SharpDevelop.Project
/// <param name="virtualDirectoryName">Virtual directory name.</param>
/// <param name="virtualDirectoryPath">Physical path.</param>
/// <returns>Error string or string null = no errors.</returns>
public static string CreateVirtualDirectory(string virtualDirectoryName, string physicalDirectoryPath)
public static string CreateVirtualDirectory(WebServer webServer, string virtualDirectoryName, string physicalDirectoryPath)
{
try {
string iisNotFoundError = ResourceService.GetString("ICSharpCode.WepProjectOptionsPanel.IISNotFound");
if (!IsIISInstalled)
if (!IsIISOrIISExpressInstalled)
return iisNotFoundError;
string error;
@ -211,19 +234,22 @@ namespace ICSharpCode.SharpDevelop.Project @@ -211,19 +234,22 @@ namespace ICSharpCode.SharpDevelop.Project
virtualDirectoryName,
out error);
break;
case IISVersion.None:
return iisNotFoundError;
default:
if (!IsIISExpressInstalled && (IISVersion == IISVersion.None))
return iisNotFoundError;
// TODO: find a better way to create IIS applications without Microsoft.Web.Administration.ServerManager
string name = "/" + virtualDirectoryName;
// load from GAC
Assembly webAdministrationAssembly = null;
try {
// iis installed
foreach(var assembly in GacInterop.GetAssemblyList()) {
foreach(DomAssemblyName assembly in GacInterop.GetAssemblyList()) {
if (assembly.FullName.Contains("Microsoft.Web.Administration")) {
webAdministrationAssembly = Assembly.Load(assembly.FullName);
break;
if (IsAssemblyForWebServer(webServer, assembly)) {
webAdministrationAssembly = Assembly.Load(assembly.FullName);
break;
}
}
}
} catch {
@ -262,5 +288,13 @@ namespace ICSharpCode.SharpDevelop.Project @@ -262,5 +288,13 @@ namespace ICSharpCode.SharpDevelop.Project
return ex.Message;
}
}
static bool IsAssemblyForWebServer(WebServer webServer, DomAssemblyName assembly)
{
if (webServer == WebServer.IISExpress) {
return (assembly.Version.Major == 7) && (assembly.Version.Minor == 9);
}
return true;
}
}
}

Loading…
Cancel
Save