private static IInstalledExtension PerformInstallation(IInstallableExtension vsix, string devenvPath, string hive) { IInstalledExtension extension; using (var settingsManager = ExternalSettingsManager.CreateForApplication(devenvPath, hive)) { var identifier = vsix.Header.Identifier; var name = vsix.Header.Name; Log($"Preparing to install '{name}' with identifier '{identifier}' into '{hive}'"); var extensionManager = new ExtensionManagerService(settingsManager); if (extensionManager.TryGetInstalledExtension(identifier, out extension)) { Log($"Extension '{name}' was already installed. Uninstalling..."); try { extensionManager.Uninstall(extension); extensionManager.CommitExternalUninstall(extension); } catch (Exception ex) { LogError($"An error ocurred while trying to uninstall '{name}'. Rolling back...", ex); RevertUninstall(extensionManager, extension); throw; } } try { Log($"Starting installation of '{name}'"); extensionManager.Install(vsix, perMachine: false); extension = extensionManager.GetInstalledExtension(identifier); Log($"Installation of '{name}' into '{hive}' completed successfully."); } catch (Exception ex) { LogError($"An error ocurred while trying to install '{name}'. Rolling back...", ex); RevertUninstall(extensionManager, extension); throw; } } return(extension); }