Exemplo n.º 1
0
        public static Task <VsInstance> Launch(VsHive hive, TimeSpan timeout, IDiagnostics diagnostics)
        {
            Process        process        = null;
            KillProcessJob killProcessJob = null;

            return(diagnostics.RunAsync("Launching Instance", async output =>
            {
                try
                {
                    process = VisualStudioUtil.StartProcess(hive);
                    killProcessJob = new KillProcessJob(process);
                    var dte = await VisualStudioUtil.GetDTE(process, timeout);
                    var invoker = (IRemoteComInvoker)dte.GetObject("VsixTesting.Invoker");
                    InvokeRemote(invoker, nameof(Remote.AutoKillWhenProcessExits), Process.GetCurrentProcess().Id);
                    killProcessJob.Release();
                    return new VsInstance(hive.Version, process, dte, invoker);
                }
                catch
                {
                    process?.Kill();
                    process?.Dispose();
                    throw;
                }
            }));
        }
Exemplo n.º 2
0
        public static async Task Prepare(VsHive hive, IEnumerable <string> extensionsToInstall, bool resetSettings, IDiagnostics diagnostics)
        {
            await diagnostics.RunAsync("Preparing Instance", async output =>
            {
                var installResult   = default((int InstallCount, bool HasSettingsFile, string Output));
                var invokerAssembly = Assembly.GetExecutingAssembly();

                using (var invoker = new TempFile(EmbeddedResourceUtil.ExtractResource(invokerAssembly, "VsixTesting.Invoker.vsix")))
                {
                    EmbeddedResourceUtil.ApplyDateTime(invoker.Path, invokerAssembly, "VsixTesting.Invoker.vsix");

                    installResult = await VisualStudioUtil.InstallExtensionsAsync(
                        hive,
                        extensionsToInstall.Concat(new[] { invoker.Path }));

                    output.WriteLine(installResult.Output);

                    if (installResult.InstallCount > 0)
                    {
                        output.WriteLine("Clearing cache");
                        await VisualStudioUtil.ClearCacheAsync(hive);
                        output.WriteLine("Updating configuration");
                        await VisualStudioUtil.UpdateConfigurationAsync(hive);
                    }
                }

                if (!installResult.HasSettingsFile || resetSettings)
                {
                    output.WriteLine("Resetting settings");
                    await VisualStudioUtil.ResetSettingsAsync(hive);
                }
            });
        }
Exemplo n.º 3
0
 public static Task AttachDebugger(Process process, bool debugMixedMode, IDiagnostics diagnostics)
 {
     return(diagnostics.RunAsync("Attaching Debugger", output =>
     {
         var dte = VisualStudioUtil.GetDteFromDebuggedProcess(Process.GetCurrentProcess());
         if (dte != null)
         {
             VisualStudioUtil.AttachDebugger(dte, process, debugMixedMode ? "Managed/Native" : "Managed");
         }
     }));
 }
Exemplo n.º 4
0
        private static void GetInstalledVisualStudios(VisualStudioVersion vsVersion, Dictionary <VisualStudioVersion, VisualStudioPath[]> versions)
        {
            var requiredWorkloads = new[] { "Microsoft.VisualStudio.Workload.ManagedGame" };
            var raw = VisualStudioUtil.FindVisualStudioDevEnvPaths((int)vsVersion, requiredWorkloads);

            var visualStudioPaths = VisualStudioUtil.ParseRawDevEnvPaths(raw)
                                    .Where(vs => !requiredWorkloads.Except(vs.Workloads).Any()) // All required workloads must be present
                                    .Select(vs => new VisualStudioPath(vs.DevEnvPath, vs.Edition))
                                    .ToArray();

            if (visualStudioPaths.Length != 0)
            {
                versions[vsVersion] = visualStudioPaths;
            }
        }
        void FilterInstallations_PreferSpecificInstallation(string version, string expectedName)
        {
            var installationPath = "C:\\Program Files (x86)\\Microsoft Visual Studio 15.0";
            var installations    = new[]
            {
                new VsInstallation(new Version(14, 0, 0), string.Empty, "VisualStudio/14.0.0"),
                new VsInstallation(new Version(15, 0, 3), string.Empty, "VisualStudio/15.0.3"),
                new VsInstallation(new Version(15, 0, 2), installationPath, "VisualStudio/15.0.2"),
                new VsInstallation(new Version(15, 0, 1), string.Empty, "VisualStudio/15.0.1"),
            };

            var applicationPath = VisualStudioUtil.GetApplicationPath(installationPath);
            var installation    = VsTestCaseFactory.FilterInstallations(installations, new VsTestSettings {
                Version = version
            }, preferedAppPath: applicationPath).First();

            Assert.Equal(expectedName, installation.Name);
        }
Exemplo n.º 6
0
    // Usage: <parentProcessId> <childProcessId> <engine>
    // Common engines:
    // - "{2E36F1D4-B23C-435D-AB41-18E608940038}" = .NET Core
    // - "{449EC4CC-30D2-4032-9256-EE18EB41B62B}" = .NET Framework
    static int Main(string[] args)
    {
        if (args.Length != 3)
        {
            return(1);
        }

        if (!int.TryParse(args[0], out var parentProcessId))
        {
            return(2);
        }

        if (!int.TryParse(args[1], out var childProcessId))
        {
            return(3);
        }

        var engine = args[2];

        var parentProcess = Process.GetProcessById(parentProcessId);

        if (parentProcess == null)
        {
            return(4);
        }

        var childProcess = Process.GetProcessById(childProcessId);

        if (childProcess == null)
        {
            return(5);
        }

        try
        {
            VisualStudioUtil.AttachDebugger(parentProcess, childProcess, engine);
        }
        catch
        {
            return(6);
        }

        return(0);
    }
Exemplo n.º 7
0
 public async Task LaunchAndDebug(IMessageBus messageBus, CancellationTokenSource cancellationTokenSource)
 {
     await ThreadUtil.RunOnStaThreadAsync(async() =>
     {
         using (var retryFilter = new RetryMessageFilter())
         {
             var diagnostics         = new VisualDiagnostics(this, DiagnosticMessageSink, messageBus, cancellationTokenSource);
             var extensionsToInstall = VsInstance.GetExtensionsToInstall(ExtensionDirectories);
             var installation        = VisualStudioUtil.FindInstallations().First(i => i.ApplicationPath == ApplicationPath);
             var hive = new VsHive(installation, RootSuffix);
             await VsInstance.Prepare(hive, extensionsToInstall, resetSettings: false, diagnostics, installInvoker: false);
             var process = await diagnostics.RunAsync("Launching Instance", () => Task.FromResult(VisualStudioUtil.StartProcess(hive)));
             if (Debugger.IsAttached)
             {
                 await VsInstance.AttachDebugger(process, DebugMixedMode, diagnostics);
             }
         }
     });
 }
Exemplo n.º 8
0
        private static int StartProcess(string filename)
        {
            var executablePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, filename);

            File.Copy(Process.GetCurrentProcess().MainModule.FileName, executablePath, true);
            using (var retryFilter = new RetryMessageFilter())
            {
                var dte     = VisualStudioUtil.GetDteFromDebuggedProcess(Process.GetCurrentProcess());
                var process = Process.Start(new ProcessStartInfo
                {
                    FileName        = executablePath,
                    Arguments       = Environment.CommandLine,
                    UseShellExecute = false,
                });
                if (dte != null)
                {
                    VisualStudioUtil.AttachDebugger(dte, process);
                }
                process.WaitForExit();
                FileUtil.TryDelete(executablePath);
                return(process.ExitCode);
            }
        }
Exemplo n.º 9
0
        public static async Task Prepare(VsHive hive, IEnumerable <string> extensionsToInstall, bool resetSettings, IDiagnostics diagnostics, bool installInvoker = true)
        {
            await diagnostics.RunAsync("Preparing Instance", async output =>
            {
                var invokerAssembly = Assembly.GetExecutingAssembly();
                var resourceName    = $"VsixTesting.Invoker{(hive.Version.Major >= 17 ? ".17" : string.Empty)}.vsix";

                using (var invoker = new TempFile(EmbeddedResourceUtil.ExtractResource(invokerAssembly, resourceName)))
                {
                    EmbeddedResourceUtil.ApplyDateTime(invoker.Path, invokerAssembly, resourceName);

                    if (installInvoker)
                    {
                        extensionsToInstall = extensionsToInstall.Concat(new[] { invoker.Path });
                    }

                    var installResult = await VisualStudioUtil.InstallExtensionsAsync(hive, extensionsToInstall);

                    output.WriteLine(installResult.Output);

                    if (installResult.InstallCount > 0)
                    {
                        output.WriteLine("Clearing cache");
                        await VisualStudioUtil.ClearCacheAsync(hive);
                        output.WriteLine("Updating configuration");
                        await VisualStudioUtil.UpdateConfigurationAsync(hive);
                    }
                }

                if (resetSettings)
                {
                    output.WriteLine("Resetting settings");
                    await VisualStudioUtil.ResetSettingsAsync(hive);
                }
            });
        }
Exemplo n.º 10
0
 void FactRunningInsideVisualStudio()
 => Assert.NotNull(VisualStudioUtil.GetDTE(Process.GetCurrentProcess()));
Exemplo n.º 11
0
 void TheoryRunningInsideVisualStudio(int zero)
 {
     Assert.NotNull(VisualStudioUtil.GetDTE(Process.GetCurrentProcess()));
     Assert.Equal(0, zero);
 }
Exemplo n.º 12
0
        private static IDictionary <VisualStudioVersion, VisualStudioPath[]> GetInstalledVisualStudios()
        {
            Dictionary <VisualStudioVersion, VisualStudioPath[]> dictionary = new Dictionary <VisualStudioVersion, VisualStudioPath[]>();

            if (SyncVS.SolutionSynchronizationSettings.IsWindows)
            {
                IEnumerator enumerator = Enum.GetValues(typeof(VisualStudioVersion)).GetEnumerator();
                try
                {
                    while (enumerator.MoveNext())
                    {
                        VisualStudioVersion visualStudioVersion = (VisualStudioVersion)enumerator.Current;
                        if (visualStudioVersion <= VisualStudioVersion.VisualStudio2015)
                        {
                            try
                            {
                                string text = Environment.GetEnvironmentVariable(string.Format("VS{0}0COMNTOOLS", (int)visualStudioVersion));
                                if (!string.IsNullOrEmpty(text))
                                {
                                    string path = Paths.Combine(new string[]
                                    {
                                        text,
                                        "..",
                                        "IDE",
                                        "devenv.exe"
                                    });
                                    if (File.Exists(path))
                                    {
                                        dictionary[visualStudioVersion] = new VisualStudioPath[]
                                        {
                                            new VisualStudioPath(path, "")
                                        };
                                        continue;
                                    }
                                }
                                text = SyncVS.GetRegistryValue(string.Format("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\{0}.0", (int)visualStudioVersion), "InstallDir");
                                if (string.IsNullOrEmpty(text))
                                {
                                    text = SyncVS.GetRegistryValue(string.Format("HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\VisualStudio\\{0}.0", (int)visualStudioVersion), "InstallDir");
                                }
                                if (!string.IsNullOrEmpty(text))
                                {
                                    string path2 = Paths.Combine(new string[]
                                    {
                                        text,
                                        "devenv.exe"
                                    });
                                    if (File.Exists(path2))
                                    {
                                        dictionary[visualStudioVersion] = new VisualStudioPath[]
                                        {
                                            new VisualStudioPath(path2, "")
                                        };
                                        continue;
                                    }
                                }
                                text = SyncVS.GetRegistryValue(string.Format("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\{0}.0\\Debugger", (int)visualStudioVersion), "FEQARuntimeImplDll");
                                if (!string.IsNullOrEmpty(text))
                                {
                                    string text2 = SyncVS.DeriveVisualStudioPath(text);
                                    if (!string.IsNullOrEmpty(text2) && File.Exists(text2))
                                    {
                                        dictionary[visualStudioVersion] = new VisualStudioPath[]
                                        {
                                            new VisualStudioPath(SyncVS.DeriveVisualStudioPath(text), "")
                                        };
                                    }
                                }
                            }
                            catch
                            {
                            }
                        }
                    }
                }
                finally
                {
                    IDisposable disposable;
                    if ((disposable = (enumerator as IDisposable)) != null)
                    {
                        disposable.Dispose();
                    }
                }
                string[] array = VisualStudioUtil.FindVisualStudioDevEnvPaths(15, "Microsoft.VisualStudio.Workload.ManagedGame");
                if (array != null && array.Length > 0)
                {
                    VisualStudioPath[] array2 = new VisualStudioPath[array.Length / 2];
                    for (int i = 0; i < array.Length / 2; i++)
                    {
                        array2[i] = new VisualStudioPath(array[i * 2], array[i * 2 + 1]);
                    }
                    dictionary[VisualStudioVersion.VisualStudio2017] = array2;
                }
            }
            return(dictionary);
        }
Exemplo n.º 13
0
        private int Run(string applicationPath, string rootSuffix, string[] args)
        {
            try
            {
                if (!ExtensionManagerUtil.IsValidProcessFileName(applicationPath, out var expectedFileName))
                {
                    return(StartProcess(expectedFileName));
                }

                var commands = new Dictionary <string, Func <int> >
                {
                    {
                        "Install", () =>
                        {
                            var extensionPaths = CommandLineParser.Many(args, "Install");
                            return(Installer.Install(applicationPath, rootSuffix, extensionPaths, allUsers: false));
                        }
                    },
                    {
                        "InstallAndStart", () =>
                        {
                            var extensionPaths = CommandLineParser.Many(args, "InstallAndStart");
                            var result         = Installer.Install(applicationPath, rootSuffix, extensionPaths, allUsers: false);
                            using (var retryFilter = new RetryMessageFilter())
                            {
                                var dte     = VisualStudioUtil.GetDteFromDebuggedProcess(Process.GetCurrentProcess());
                                var process = Process.Start(applicationPath, $"/RootSuffix {rootSuffix}");
                                if (dte != null)
                                {
                                    VisualStudioUtil.AttachDebugger(dte, process);
                                }
                                return(result);
                            }
                        }
                    },
                    {
                        "Uninstall", () =>
                        {
                            var extensionIds = CommandLineParser.Many(args, "Uninstall");
                            return(Installer.Uninstall(applicationPath, rootSuffix, extensionIds, skipGlobal: false));
                        }
                    },
                    {
                        "IsProfileInitialized", () =>
                        {
                            using (var externalSettingsManager = ExternalSettingsManager.CreateForApplication(applicationPath, rootSuffix))
                            {
                                var settings             = externalSettingsManager.GetWritableSettingsStore(SettingsScope.UserSettings);
                                var isProfileInitialized = settings.CollectionExists("Profile") && settings.GetPropertyNames("Profile").Contains("LastResetSettingsFile");
                                return(Convert.ToInt32(isProfileInitialized));
                            }
                        }
                    },
                };

                foreach (var cmd in commands)
                {
                    if (CommandLineParser.Contains(args, cmd.Key))
                    {
                        return(cmd.Value());
                    }
                }

                throw new Exception($@"Invalid command");
            }
            catch (Exception e)
            {
                Console.Error.Write(e.ToString());
                return(-1);
            }
        }
Exemplo n.º 14
0
        /// <summary>
        /// Detects Visual Studio installations using the Windows registry
        /// </summary>
        /// <returns>
        /// The detected Visual Studio installations
        /// </returns>
        private static IDictionary <VisualStudioVersion, VisualStudioPath[]> GetInstalledVisualStudios()
        {
            var versions = new Dictionary <VisualStudioVersion, VisualStudioPath[]>();

            if (SolutionSynchronizationSettings.IsWindows)
            {
                foreach (VisualStudioVersion version in Enum.GetValues(typeof(VisualStudioVersion)))
                {
                    if (version > VisualStudioVersion.VisualStudio2015)
                    {
                        continue;
                    }

                    try
                    {
                        // Try COMNTOOLS environment variable first
                        string key = Environment.GetEnvironmentVariable(string.Format("VS{0}0COMNTOOLS", (int)version));
                        if (!string.IsNullOrEmpty(key))
                        {
                            string path = UnityEditor.Utils.Paths.Combine(key, "..", "IDE", "devenv.exe");
                            if (File.Exists(path))
                            {
                                versions[version] = new[] { new VisualStudioPath(path) };
                                continue;
                            }
                        }

                        // Try the proper registry key
                        key = GetRegistryValue(
                            string.Format(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\{0}.0", (int)version), "InstallDir");

                        // Try to fallback to the 32bits hive
                        if (string.IsNullOrEmpty(key))
                        {
                            key = GetRegistryValue(
                                string.Format(@"HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\{0}.0", (int)version), "InstallDir");
                        }

                        if (!string.IsNullOrEmpty(key))
                        {
                            string path = UnityEditor.Utils.Paths.Combine(key, "devenv.exe");
                            if (File.Exists(path))
                            {
                                versions[version] = new[] { new VisualStudioPath(path) };
                                continue;
                            }
                        }

                        // Fallback to debugger key
                        key = GetRegistryValue(
                            // VS uses this key for the local debugger path
                            string.Format(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\{0}.0\Debugger", (int)version), "FEQARuntimeImplDll");
                        if (!string.IsNullOrEmpty(key))
                        {
                            string path = DeriveVisualStudioPath(key);
                            if (!string.IsNullOrEmpty(path) && File.Exists(path))
                            {
                                versions[version] = new[] { new VisualStudioPath(DeriveVisualStudioPath(key)) }
                            }
                            ;
                        }
                    }
                    catch
                    {
                        // This can happen with a registry lookup failure
                    }
                }

                var requiredWorkloads = new[] { "Microsoft.VisualStudio.Workload.ManagedGame" };
                var raw = VisualStudioUtil.FindVisualStudioDevEnvPaths((int)VisualStudioVersion.VisualStudio2017, requiredWorkloads);

                var visualStudioPaths = VisualStudioUtil.ParseRawDevEnvPaths(raw)
                                        .Where(vs => !requiredWorkloads.Except(vs.Workloads).Any()) // All required workloads must be present
                                        .Select(vs => new VisualStudioPath(vs.DevEnvPath, vs.Edition))
                                        .ToArray();

                if (visualStudioPaths.Length != 0)
                {
                    versions[VisualStudioVersion.VisualStudio2017] = visualStudioPaths;
                }
            }

            return(versions);
        }
Exemplo n.º 15
0
 void ThrowOnBadProcessNameWorks()
 {
     VisualStudioUtil.ThrowOnBadProcessName("DEVenv");
     Assert.Throws <ArgumentException>(() => VisualStudioUtil.ThrowOnBadProcessName("devenv2"));
     Assert.Throws <NotSupportedException>(() => VisualStudioUtil.ThrowOnBadProcessName("wdexpress"));
 }