Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }