public async void Start() { try { BuildSolution(); string target = GetStartupAssemblyPath(); string exe = null; string outputDirectory = Path.GetDirectoryName(target); string url = null; string serverurl = null; string page = null; string workingDirectory = null; string arguments = null; Project startup = GetStartupProject(); var props = startup.ConfigurationManager.ActiveConfiguration.Properties; //Dump(startup); bool isWeb = ((object[])startup.ExtenderNames).Any(x => x.ToString() == "WebApplication") || startup.Object is VsWebSite.VSWebSite; var isNet4 = true; var frameworkprop = props.Get("TargetFrameworkMoniker") ?.Split(',') .Where(t => t.StartsWith("Version=")) .Select(t => t.Substring("Version=".Length)) .FirstOrDefault(); isNet4 = (frameworkprop == null || string.Compare(frameworkprop, "v4.0") >= 0); var action = "0"; action = props.Get("StartAction"); exe = props.Get("StartProgram"); arguments = props.Get("StartArguments"); workingDirectory = props.Get("StartWorkingDirectory"); url = props.Get("StartURL"); page = props.Get("StartPage"); if (isWeb) { var ext = (WAProjectExtender)startup.Extender["WebApplication"]; action = ext.DebugStartAction.ToString(); outputDirectory = new Uri(ext.OpenedURL).LocalPath; serverurl = ext.BrowseURL ?? ext.NonSecureUrl ?? ext.SecureUrl ?? ext.IISUrl ?? "http://127.0.0.1:9000"; var uri = new Uri(serverurl); var port = uri.Port; if (ext.UseIIS) // when running IIS, use random xsp port { port = 15000 + new Random(target.GetHashCode()).Next(5000); uri = new Uri($"{uri.Scheme}://{uri.Host}:{port}"); serverurl = uri.AbsoluteUri; } var ssl = uri.Scheme.StartsWith("https"); var task = new StartWebTask() { Framework = isNet4 ? Frameworks.Net4 : Frameworks.Net2, LogLevels = "All", NetFXBuild = false, SourcePath = outputDirectory, Ssl = ssl, XspPort = port }; if (action == "2") { task.StartProgram = new StartProgramTask() { Program = ext.StartExternalProgram, Arguments = ext.StartCmdLineArguments, WorkingDir = ext.StartWorkingDirectory, }; } else if (action == "3") { task.OpenUrl = ext.StartExternalUrl; return; } else if (action == "0") { task.OpenUrl = ext.CurrentDebugUrl; } else if (action == "1") { task.OpenUrl = ext.StartPageUrl; } Server.Default.Start(task); } else { if (action == "0" || action == "2") { exe = target; } var task = new StartProgramTask() { Program = exe, Arguments = arguments, WorkingDir = workingDirectory }; Server.Default.Start(task); if (action == "2") { System.Diagnostics.Process.Start(url); } } } catch (Exception ex) { logger.Error(ex); MessageBox.Show(ex.Message, "MonoTools.Debugger", MessageBoxButton.OK, MessageBoxImage.Error); } }
public async Task AttachDebugger(string host, bool local = false) { string target = GetStartupAssemblyPath(); string exe = null, debug = null; string outputDirectory = Path.GetDirectoryName(target); string url = null; string serverurl = null; string page = null; string workingDirectory = null; string arguments = null; Project startup = GetStartupProject(); var props = startup.ConfigurationManager.ActiveConfiguration.Properties; //Dump(startup); bool isWeb = ((object[])startup.ExtenderNames).Any(x => x.ToString() == "WebApplication") || startup.Object is VsWebSite.VSWebSite; var isNet4 = true; var frameworkprop = props.Get("TargetFrameworkMoniker") ?.Split(',') .Where(t => t.StartsWith("Version=")) .Select(t => t.Substring("Version=".Length)) .FirstOrDefault(); isNet4 = (frameworkprop == null || string.Compare(frameworkprop, "v4.0") >= 0); Frameworks framework = isNet4 ? Frameworks.Net4 : Frameworks.Net2; var action = "0"; action = props.Get("StartAction"); exe = props.Get("StartProgram"); arguments = props.Get("StartArguments"); workingDirectory = props.Get("StartWorkingDirectory"); url = props.Get("StartURL"); page = props.Get("StartPage"); if (isWeb) { outputDirectory = Path.GetDirectoryName(outputDirectory); var ext = (WAProjectExtender)startup.Extender["WebApplication"]; action = ext.DebugStartAction.ToString(); serverurl = ext.BrowseURL ?? ext.NonSecureUrl ?? ext.SecureUrl ?? ext.IISUrl ?? "http://127.0.0.1:9000"; var uri = new Uri(serverurl); var port = uri.Port; if (ext.UseIIS) // when running IIS, use random xsp port { port = 15000 + new Random(target.GetHashCode()).Next(5000); uri = new Uri($"{uri.Scheme}://{uri.Host}:{port}"); serverurl = uri.AbsoluteUri; } var task = new StartWebTask() { Framework = framework, LogLevels = "All", NetFXBuild = false, OpenUrl = serverurl, Ssl = uri.Scheme.StartsWith("https"), SourcePath = outputDirectory, XspPort = port }; if (action == "2") { task.StartProgram = new StartProgramTask() { Program = ext.StartExternalProgram, Arguments = ext.StartCmdLineArguments, WorkingDir = ext.StartWorkingDirectory }; } else if (action == "3") { task.OpenUrl = ext.StartExternalUrl; } else if (action == "0") { task.OpenUrl = ext.CurrentDebugUrl; } else if (action == "1") { task.OpenUrl = ext.StartPageUrl; } await StartDebugger(Server.Default, task); } else { var outputType = startup.Properties.Get("OutputType"); // output type (0: windows app, 1: console app, 2: class lib) if (outputType == "2") { throw new InvalidOperationException("Cannot start a class library."); } var appType = outputType == "0" ? ApplicationTypes.WindowsApplication : ApplicationTypes.ConsoleApplication; var task = new StartProgramTask() { Framework = framework, NetFXBuild = false, Program = target, Arguments = arguments, SourcePath = outputDirectory, WorkingDir = workingDirectory }; if (action == "2") { System.Diagnostics.Process.Start(url); } else if (action == "1") { var run = new ProcessStartInfo(exe, arguments) { WorkingDirectory = workingDirectory, UseShellExecute = false, CreateNoWindow = false }; System.Diagnostics.Process.Start(run); } } }