private static bool TryGetVisualStudioFromDeveloperConsole(out VisualStudioInstance instance) { instance = null; string vsInstallDirEnvVar = Environment.GetEnvironmentVariable("VSINSTALLDIR"); if (vsInstallDirEnvVar.IsNullOrWhiteSpace()) { return(false); } if (!Directory.Exists(vsInstallDirEnvVar)) { return(false); } VisualStudioConfiguration configuration = new VisualStudioConfiguration(); instance = configuration.GetInstanceForPath(vsInstallDirEnvVar); return(instance != null); }
private static DevelopmentEnvironment LoadDevelopmentEnvironmentFromCurrentWindow() { string basePath = null; using (ManualResetEvent processExited = new ManualResetEvent(false)) using (Process process = new Process { EnableRaisingEvents = true, StartInfo = new ProcessStartInfo { Arguments = "--info", CreateNoWindow = true, FileName = "dotnet", UseShellExecute = false, RedirectStandardError = true, RedirectStandardInput = true, RedirectStandardOutput = true, WorkingDirectory = Environment.CurrentDirectory, }, }) { process.StartInfo.EnvironmentVariables["DOTNET_CLI_UI_LANGUAGE"] = "en-US"; process.StartInfo.EnvironmentVariables["DOTNET_CLI_TELEMETRY_OPTOUT"] = bool.TrueString; process.ErrorDataReceived += (sender, args) => { }; process.OutputDataReceived += (sender, args) => { if (!String.IsNullOrWhiteSpace(args?.Data)) { Match match = DotNetBasePathRegex.Match(args.Data); if (match.Success && match.Groups["Path"].Success) { basePath = match.Groups["Path"].Value.Trim(); } } }; process.Exited += (sender, args) => { processExited.Set(); }; try { if (!process.Start()) { return(new DevelopmentEnvironment("Failed to find .NET Core SDK, could not start dotnet")); } } catch (Exception e) { return(new DevelopmentEnvironment("Failed to find .NET Core SDK, failed launching dotnet", e.ToString())); } process.StandardInput.Close(); process.BeginErrorReadLine(); process.BeginOutputReadLine(); switch (WaitHandle.WaitAny(new WaitHandle[] { processExited }, TimeSpan.FromSeconds(5))) { case WaitHandle.WaitTimeout: break; case 0: break; } if (!process.HasExited) { try { process.Kill(); } catch { } } if (!basePath.IsNullOrWhiteSpace()) { DevelopmentEnvironment developmentEnvironment = new DevelopmentEnvironment { MSBuildDll = new FileInfo(Path.Combine(basePath, "MSBuild.dll")), }; RegisterMSBuildAssemblyResolver(developmentEnvironment); if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && TryFindMSBuildOnPath(out string msbuildExePath)) { developmentEnvironment.MSBuildExe = new FileInfo(msbuildExePath); developmentEnvironment.VisualStudio = VisualStudioConfiguration.GetInstanceForPath(msbuildExePath); } return(developmentEnvironment); } return(new DevelopmentEnvironment("Failed to find .NET Core SDK, ensure you have .NET Core SDK installed and if you have a global.json that it specifies a version you have installed.")); } }
/// <summary> /// Launches Visual Studio. /// </summary> /// <param name="arguments">The current <see cref="ProgramArguments" />.</param> /// <param name="visualStudioInstance">A <see cref="VisualStudioInstance" /> object representing which instance of Visual Studio to launch.</param> /// <param name="solutionFileFullPath">The full path to the solution file.</param> /// <param name="logger">A <see cref="ISlnGenLogger" /> to use for logging.</param> /// <returns>true if Visual Studio was launched, otherwise false.</returns> public static bool TryLaunch(ProgramArguments arguments, VisualStudioInstance visualStudioInstance, string solutionFileFullPath, ISlnGenLogger logger) { if (!arguments.ShouldLaunchVisualStudio()) { return(true); } if (!Utility.RunningOnWindows) { logger.LogWarning("Launching Visual Studio is not currently supported on your operating system."); return(true); } string devEnvFullPath = arguments.GetDevEnvFullPath(visualStudioInstance); if (!devEnvFullPath.IsNullOrWhiteSpace()) { visualStudioInstance = VisualStudioConfiguration.GetInstanceForPath(devEnvFullPath); } if (visualStudioInstance == null) { logger.LogError( Program.CurrentDevelopmentEnvironment.IsCorext ? $"Could not find a Visual Studio {Environment.GetEnvironmentVariable("VisualStudioVersion")} installation. Please do one of the following:\n a) Specify a full path to devenv.exe via the -vs command-line argument\n b) Update your corext.config to specify a version of MSBuild.Corext that matches a Visual Studio version you have installed\n c) Install a version of Visual Studio that matches the version of MSBuild.Corext in your corext.config" : "Could not find a Visual Studio installation. Please run from a command window that has MSBuild.exe on the PATH or specify the full path to devenv.exe via the -vs command-line argument"); return(false); } if (visualStudioInstance.IsBuildTools) { logger.LogError("Cannot use a BuildTools instance of Visual Studio."); return(false); } if (!File.Exists(devEnvFullPath)) { logger.LogError($"The specified path to Visual Studio ({devEnvFullPath}) does not exist or is inaccessible."); return(false); } CommandLineBuilder commandLineBuilder = new CommandLineBuilder(); commandLineBuilder.AppendFileNameIfNotNull(solutionFileFullPath); if (!arguments.ShouldLoadProjectsInVisualStudio()) { commandLineBuilder.AppendSwitch(DoNotLoadProjectsCommandLineArgument); } try { Process process = new Process { StartInfo = new ProcessStartInfo { FileName = devEnvFullPath, Arguments = commandLineBuilder.ToString(), UseShellExecute = false, }, }; logger.LogMessageHigh("Launching Visual Studio..."); logger.LogMessageLow(" FileName = {0}", process.StartInfo.FileName); logger.LogMessageLow(" Arguments = {0}", process.StartInfo.Arguments); if (!process.Start()) { logger.LogError("Failed to launch Visual Studio."); } } catch (Exception e) { logger.LogError($"Failed to launch Visual Studio. {e.Message}"); } return(true); }