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(); } }
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); } } }
/// <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); } }
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); } } } }
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); } } }
public static bool VisualStudioVersion_IsValid(VisualStudioVersions value, out string failReason) { failReason = ""; return(true); }
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); } } } }