Exemple #1
0
        public static bool Attach(Process process, VisualStudioVersions vsVersion = VisualStudioVersions.Automatic)
        {
            MessageFilter.Register();

            try
            {
                if (vsVersion == VisualStudioVersions.Automatic)
                {
                    var attachSucceed = false;
                    foreach (var progId in DteProgIds.Values)
                    {
                        try
                        {
                            DebuggerLauncher.TryAttachDebugger(process, progId);
                            attachSucceed = true;
                            break;
                        }
                        catch (Exception)
                        {
                            // ignored
                        }
                    }

                    if (attachSucceed)
                    {
                        return(true);
                    }

                    MessageBox.Show(
                        "Unable to launch and attach to debugger, make sure you have Visual Studio (2010/2012/2013/2015) installed correctly.",
                        "Launch and Debug", MessageBoxButton.OK, MessageBoxImage.Exclamation);

                    return(false);
                }
                else
                {
                    try
                    {
                        DebuggerLauncher.TryAttachDebugger(process, DteProgIds[vsVersion]);
                        return(true);
                    }
                    catch (Exception exception)
                    {
                        MessageBox.Show(
                            $"Unable to launch and attach to debugger, make sure you have Visual Studio of selected version installed correctly.\n\nError: {exception.Message}",
                            "Launch and Debug", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                        return(false);
                    }
                }
            }
            finally
            {
                MessageFilter.Revoke();
            }
        }
Exemple #2
0
        public static bool GetDebuggerAvailability(VisualStudioVersions vsVersion)
        {
            if (vsVersion == VisualStudioVersions.Automatic)
            {
                return(DteProgIds.Keys.Any(DebuggerLauncher.GetDebuggerAvailability));
            }

            try
            {
                dynamic dte = Marshal.GetActiveObject(DteProgIds[vsVersion]);
                return(dte != null);
            }
            catch
            {
                return(false);
            }
        }
 /// <summary>
 /// Create suo startup files for a specific solution file.
 /// </summary>
 /// <remarks>
 /// All existing suo files will be overwritten.
 /// </remarks>
 public void CreateForSolutionFile(string solutionFilePath, List<string> startupProjectGuids, VisualStudioVersions visualStudioVersions = VisualStudioVersions.All)
 {
     Guard.AgainstNullAndEmpty(solutionFilePath, "solutionFilePath");
     Guard.AgainstNonExistingFile(solutionFilePath, "solutionFilePath");
     Guard.AgainstNullAndEmpty(startupProjectGuids, "startupProjectGuids");
     var solutionDirectory = Path.GetDirectoryName(solutionFilePath);
     if ((visualStudioVersions & VisualStudioVersions.Vs2015) == VisualStudioVersions.Vs2015)
     {
         var solutionName = Path.GetFileNameWithoutExtension(solutionFilePath);
         var suoDirectoryPath = Path.Combine(solutionDirectory, ".vs", solutionName, "v14");
         Directory.CreateDirectory(suoDirectoryPath);
         var suoFilePath = Path.Combine(suoDirectoryPath, ".suo");
         File.Delete(suoFilePath);
         using (var stream = Resource.AsStream("Solution2015.suotemplate"))
         {
             WriteToStream(suoFilePath, startupProjectGuids, stream);
         }
     }
     if ((visualStudioVersions & VisualStudioVersions.Vs2013) == VisualStudioVersions.Vs2013)
     {
         var suoFilePath = Path.ChangeExtension(solutionFilePath, ".v12.suo");
         File.Delete(suoFilePath);
         using (var stream = Resource.AsStream("Solution2013.suotemplate"))
         {
             WriteToStream(suoFilePath, startupProjectGuids, stream);
         }
     }
     if ((visualStudioVersions & VisualStudioVersions.Vs2012) == VisualStudioVersions.Vs2012)
     {
         var suoFilePath = Path.ChangeExtension(solutionFilePath, ".v11.suo");
         File.Delete(suoFilePath);
         using (var stream = Resource.AsStream("Solution2012.suotemplate"))
         {
             WriteToStream(suoFilePath, startupProjectGuids, stream);
         }
     }
 }
Exemple #4
0
        /// <summary>
        /// Create suo startup files for a specific solution file.
        /// </summary>
        /// <remarks>
        /// All existing suo files will be overwritten.
        /// </remarks>
        public void CreateForSolutionFile(string solutionFilePath, List <string> startupProjectGuids, VisualStudioVersions visualStudioVersions = VisualStudioVersions.All)
        {
            Guard.AgainstNullAndEmpty(solutionFilePath, nameof(solutionFilePath));
            Guard.AgainstNull(startupProjectGuids, nameof(startupProjectGuids));
            Guard.AgainstNonExistingFile(solutionFilePath, nameof(solutionFilePath));
            if (startupProjectGuids.Count == 0)
            {
                throw new ArgumentOutOfRangeException(nameof(startupProjectGuids), $"For solutionFilePath: '{solutionFilePath}'");
            }
            var solutionDirectory = Path.GetDirectoryName(solutionFilePath);

            if (visualStudioVersions.HasFlag(VisualStudioVersions.Vs2019))
            {
                var solutionName     = Path.GetFileNameWithoutExtension(solutionFilePath);
                var suoDirectoryPath = Path.Combine(solutionDirectory, ".vs", solutionName, "v16");
                Directory.CreateDirectory(suoDirectoryPath);
                var suoFilePath = Path.Combine(suoDirectoryPath, ".suo");
                File.Delete(suoFilePath);
                using var templateStream = Resource.AsStream("Solution2019.suotemplate");
                WriteToStream(suoFilePath, startupProjectGuids, templateStream);
            }

            if (visualStudioVersions.HasFlag(VisualStudioVersions.Vs2017))
            {
                var solutionName     = Path.GetFileNameWithoutExtension(solutionFilePath);
                var suoDirectoryPath = Path.Combine(solutionDirectory, ".vs", solutionName, "v15");
                Directory.CreateDirectory(suoDirectoryPath);
                var suoFilePath = Path.Combine(suoDirectoryPath, ".suo");
                File.Delete(suoFilePath);
                using var templateStream = Resource.AsStream("Solution2017.suotemplate");
                WriteToStream(suoFilePath, startupProjectGuids, templateStream);
            }

            if (visualStudioVersions.HasFlag(VisualStudioVersions.Vs2015))
            {
                var solutionName     = Path.GetFileNameWithoutExtension(solutionFilePath);
                var suoDirectoryPath = Path.Combine(solutionDirectory, ".vs", solutionName, "v14");
                Directory.CreateDirectory(suoDirectoryPath);
                var suoFilePath = Path.Combine(suoDirectoryPath, ".suo");
                File.Delete(suoFilePath);
                using var templateStream = Resource.AsStream("Solution2015.suotemplate");
                WriteToStream(suoFilePath, startupProjectGuids, templateStream);
            }

            if (visualStudioVersions.HasFlag(VisualStudioVersions.Vs2013))
            {
                var suoFilePath = Path.ChangeExtension(solutionFilePath, ".v12.suo");
                File.Delete(suoFilePath);
                using var templateStream = Resource.AsStream("Solution2013.suotemplate");
                WriteToStream(suoFilePath, startupProjectGuids, templateStream);
            }

            if (visualStudioVersions.HasFlag(VisualStudioVersions.Vs2012))
            {
                var suoFilePath = Path.ChangeExtension(solutionFilePath, ".v11.suo");
                File.Delete(suoFilePath);
                using var templateStream = Resource.AsStream("Solution2012.suotemplate");
                WriteToStream(suoFilePath, startupProjectGuids, templateStream);
            }
        }
Exemple #5
0
        private static void CheckVisualStudioAndBuildTools()
        {
            // Check if there is any VS2019 installed with necessary workloads
            var matchingVisualStudioInstallation = VisualStudioVersions.AvailableVisualStudioInstances.FirstOrDefault(x => NecessaryVS2019Workloads.All(workload => x.PackageVersions.ContainsKey(workload)));

            if (AllowVisualStudioOnly && matchingVisualStudioInstallation != null)
            {
                if (!matchingVisualStudioInstallation.Complete)
                {
                    MessageBox.Show("We detected Visual Studio 2019 was already installed but is not in a complete state.\r\nYou probably have to reboot, otherwise Xenko projects won't properly compile.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                // Check if there is actually a VS2019+ installed
                var existingVisualStudio2019Install = VisualStudioVersions.AvailableVisualStudioInstances.FirstOrDefault(x => x.PackageVersions.ContainsKey("Microsoft.VisualStudio.Component.CoreEditor"));
                var vsInstallerPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), @"Microsoft Visual Studio\Installer\vs_installer.exe");
                if (AllowVisualStudioOnly && existingVisualStudio2019Install != null && File.Exists(vsInstallerPath))
                {
                    // First, check if a Visual Studio update is needed
                    // Note: not necessary since VS2019, still keeping code for when we'll need a specific VS2019 version
                    if (existingVisualStudio2019Install.Version.Major == 16 && existingVisualStudio2019Install.Version.Minor < 0)
                    {
                        // Not sure why, but it seems VS Update is sometimes sending Ctrl+C to our process...
                        try
                        {
                            Console.CancelKeyPress += Console_IgnoreControlC;
                            var vsInstallerExitCode = RunProgramAndAskUntilSuccess("Visual Studio", vsInstallerPath, $"update --passive --norestart --installPath \"{existingVisualStudio2019Install.InstallationPath}\"");
                            if (vsInstallerExitCode != 0)
                            {
                                var errorMessage = $"Visual Studio 2019 update failed with error {vsInstallerExitCode}";
                                MessageBox.Show(errorMessage, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                throw new InvalidOperationException(errorMessage);
                            }
                        }
                        finally
                        {
                            Console.CancelKeyPress -= Console_IgnoreControlC;
                        }
                    }

                    // Check workloads
                    {
                        var vsInstallerExitCode = RunProgramAndAskUntilSuccess("Visual Studio", vsInstallerPath, $"modify --passive --norestart --installPath \"{existingVisualStudio2019Install.InstallationPath}\" {string.Join(" ", NecessaryVS2019Workloads.Select(x => $"--add {x}"))}");
                        if (vsInstallerExitCode != 0)
                        {
                            var errorMessage = $"Visual Studio 2019 install failed with error {vsInstallerExitCode}";
                            MessageBox.Show(errorMessage, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            throw new InvalidOperationException(errorMessage);
                        }
                    }

                    // Refresh existingVisualStudio2019Install.Complete and check if restart is needed
                    VisualStudioVersions.Refresh();
                    existingVisualStudio2019Install = VisualStudioVersions.AvailableVisualStudioInstances.FirstOrDefault(x => x.InstallationPath == existingVisualStudio2019Install.InstallationPath);
                    if (existingVisualStudio2019Install != null && !existingVisualStudio2019Install.Complete)
                    {
                        MessageBox.Show("Visual Studio 2019 install needs a computer restart.\r\nIf you don't restart, Xenko projects likely won't compile.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                else
                {
                    // Otherwise, fallback to vs_buildtools standalone detection and install
                    var    buildTools            = VisualStudioVersions.AvailableBuildTools.Where(x => x.PackageVersions.ContainsKey("Microsoft.VisualStudio.Workload.MSBuildTools")).ToList();
                    var    matchingBuildTool     = buildTools.FirstOrDefault(x => NecessaryBuildTools2019Workloads.All(workload => x.PackageVersions.ContainsKey(workload)));
                    string buildToolsCommandLine = null;

                    if (matchingBuildTool == null)
                    {
                        if (buildTools.Count > 0)
                        {
                            // Incomplete installation
                            buildToolsCommandLine = $"modify --wait --passive --norestart --installPath \"{buildTools.First().InstallationPath}\" {string.Join(" ", NecessaryBuildTools2019Workloads.Select(x => $"--add {x}"))}";
                        }
                        else
                        {
                            // Not installed yet
                            buildToolsCommandLine = $"--wait --passive --norestart {string.Join(" ", NecessaryBuildTools2019Workloads.Select(x => $"--add {x}"))}";
                        }
                    }

                    if (buildToolsCommandLine != null)
                    {
                        // Run vs_buildtools again
                        RunProgramAndAskUntilSuccess("Build Tools", "vs_buildtools.exe", buildToolsCommandLine);
                    }
                }
            }
        }
Exemple #6
0
 public DebuggerInfo(VisualStudioVersions vsVersion, string name, bool alwaysAvailable = false)
 {
     this.VSVersion   = vsVersion;
     this.Name        = name;
     this.IsAvailable = alwaysAvailable || DebuggerLauncher.GetDebuggerAvailability(vsVersion);
 }
        /// <summary>
        /// Create suo startup files for a specific solution file.
        /// </summary>
        /// <remarks>
        /// All existing suo files will be overwritten.
        /// </remarks>
        public void CreateForSolutionFile(string solutionFilePath, List <string> startupProjectGuids, VisualStudioVersions visualStudioVersions = VisualStudioVersions.All)
        {
            Guard.AgainstNullAndEmpty(solutionFilePath, "solutionFilePath");
            Guard.AgainstNonExistingFile(solutionFilePath, "solutionFilePath");
            Guard.AgainstNullAndEmpty(startupProjectGuids, "startupProjectGuids");
            var solutionDirectory = Path.GetDirectoryName(solutionFilePath);

            if ((visualStudioVersions & VisualStudioVersions.Vs2015) == VisualStudioVersions.Vs2015)
            {
                var solutionName     = Path.GetFileNameWithoutExtension(solutionFilePath);
                var suoDirectoryPath = Path.Combine(solutionDirectory, ".vs", solutionName, "v14");
                Directory.CreateDirectory(suoDirectoryPath);
                var suoFilePath = Path.Combine(suoDirectoryPath, ".suo");
                File.Delete(suoFilePath);
                using (var stream = Resource.AsStream("Solution2015.suotemplate"))
                {
                    WriteToStream(suoFilePath, startupProjectGuids, stream);
                }
            }
            if ((visualStudioVersions & VisualStudioVersions.Vs2013) == VisualStudioVersions.Vs2013)
            {
                var suoFilePath = Path.ChangeExtension(solutionFilePath, ".v12.suo");
                File.Delete(suoFilePath);
                using (var stream = Resource.AsStream("Solution2013.suotemplate"))
                {
                    WriteToStream(suoFilePath, startupProjectGuids, stream);
                }
            }
            if ((visualStudioVersions & VisualStudioVersions.Vs2012) == VisualStudioVersions.Vs2012)
            {
                var suoFilePath = Path.ChangeExtension(solutionFilePath, ".v11.suo");
                File.Delete(suoFilePath);
                using (var stream = Resource.AsStream("Solution2012.suotemplate"))
                {
                    WriteToStream(suoFilePath, startupProjectGuids, stream);
                }
            }
        }
Exemple #8
0
 public static bool VisualStudioVersion_IsValid(VisualStudioVersions value, out string failReason)
 {
     failReason = "";
     return(true);
 }
Exemple #9
0
        private static void CheckVisualStudioAndBuildTools()
        {
            var vsInstallerPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), @"Microsoft Visual Studio\Installer\vs_installer.exe");

            // Check if an old version of VS2017 is installed because some people had to update before everything was working
            // https://github.com/stride3d/stride/issues/673#issuecomment-621155230
            foreach (var vs2017Instance in VisualStudioVersions.AllAvailableVisualStudioInstances.Where(x => x.Version.Major == 15).ToList())
            {
                if (vs2017Instance.Version.Minor < 9)
                {
                    UpdateVisualStudioToLatest(vsInstallerPath, vs2017Instance);
                }
            }

            // Check if there is any VS2019 installed with necessary workloads
            var matchingVisualStudioInstallation = VisualStudioVersions.AvailableVisualStudioInstances.FirstOrDefault(x => NecessaryVS2019Workloads.All(workload => x.PackageVersions.ContainsKey(workload)));

            if (AllowVisualStudioOnly && matchingVisualStudioInstallation != null)
            {
                if (!matchingVisualStudioInstallation.Complete)
                {
                    MessageBox.Show("We detected Visual Studio 2019 was already installed but is not in a complete state.\r\nYou probably have to reboot, otherwise Stride projects won't properly compile.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                // Check if there is actually a VS2019+ installed
                var existingVisualStudio2019Install = VisualStudioVersions.AvailableVisualStudioInstances.FirstOrDefault(x => x.PackageVersions.ContainsKey("Microsoft.VisualStudio.Component.CoreEditor"));
                if (AllowVisualStudioOnly && existingVisualStudio2019Install != null && File.Exists(vsInstallerPath))
                {
                    // First, check if a Visual Studio update is needed
                    // Note: not necessary since VS2019, still keeping code for when we'll need a specific VS2019 version
                    if (existingVisualStudio2019Install.Version.Major == 16 && existingVisualStudio2019Install.Version.Minor < 0)
                    {
                        UpdateVisualStudioToLatest(vsInstallerPath, existingVisualStudio2019Install);
                    }

                    // Second, check workloads
                    {
                        var vsInstallerExitCode = RunProgramAndAskUntilSuccess("Visual Studio", vsInstallerPath, $"modify --noUpdateInstaller --passive --norestart --installPath \"{existingVisualStudio2019Install.InstallationPath}\" {string.Join(" ", NecessaryVS2019Workloads.Select(x => $"--add {x}"))}", DialogBoxTryAgainVS);
                        if (vsInstallerExitCode != 0)
                        {
                            var errorMessage = $"Visual Studio 2019 install failed with error {vsInstallerExitCode}";
                            MessageBox.Show(errorMessage, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            throw new InvalidOperationException(errorMessage);
                        }
                    }

                    // Refresh existingVisualStudio2019Install.Complete and check if restart is needed
                    VisualStudioVersions.Refresh();
                    existingVisualStudio2019Install = VisualStudioVersions.AvailableVisualStudioInstances.FirstOrDefault(x => x.InstallationPath == existingVisualStudio2019Install.InstallationPath);
                    if (existingVisualStudio2019Install != null && !existingVisualStudio2019Install.Complete)
                    {
                        MessageBox.Show("Visual Studio 2019 install needs a computer restart.\r\nIf you don't restart, Stride projects likely won't compile.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                else
                {
                    // Otherwise, fallback to vs_buildtools standalone detection and install
                    var    buildTools            = VisualStudioVersions.AvailableBuildTools.Where(x => x.PackageVersions.ContainsKey("Microsoft.VisualStudio.Workload.MSBuildTools")).ToList();
                    var    matchingBuildTool     = buildTools.FirstOrDefault(x => NecessaryBuildTools2019Workloads.All(workload => x.PackageVersions.ContainsKey(workload)));
                    string buildToolsCommandLine = null;

                    if (matchingBuildTool == null)
                    {
                        if (buildTools.Count > 0)
                        {
                            // Incomplete installation
                            buildToolsCommandLine = $"modify --wait --passive --norestart --installPath \"{buildTools.First().InstallationPath}\" {string.Join(" ", NecessaryBuildTools2019Workloads.Select(x => $"--add {x}"))}";
                        }
                        else
                        {
                            // Not installed yet
                            buildToolsCommandLine = $"--wait --passive --norestart {string.Join(" ", NecessaryBuildTools2019Workloads.Select(x => $"--add {x}"))}";
                        }
                    }

                    if (buildToolsCommandLine != null)
                    {
                        // Run vs_buildtools again
                        RunProgramAndAskUntilSuccess("Build Tools", "vs_buildtools.exe", buildToolsCommandLine, DialogBoxTryAgainVS);
                    }
                }
            }
        }