public void EnableCurrentSolutionForRestore(bool fromActivation) { if (!_solutionManager.IsSolutionOpen) { throw new InvalidOperationException(VsResources.SolutionNotAvailable); } if (fromActivation) { // if not in quiet mode, ask user for confirmation before proceeding bool?result = MessageHelper.ShowQueryMessage( VsResources.PackageRestoreConfirmation, VsResources.DialogTitle, showCancelButton: false); if (result != true) { return; } } Exception exception = null; IVsThreadedWaitDialog2 waitDialog; _waitDialogFactory.CreateInstance(out waitDialog); try { waitDialog.StartWaitDialog( VsResources.DialogTitle, VsResources.PackageRestoreWaitMessage, String.Empty, varStatusBmpAnim: null, szStatusBarText: null, iDelayToShowDialog: 0, fIsCancelable: false, fShowMarqueeProgress: true); if (fromActivation) { // only enable package restore consent if this is called as a result of user enabling package restore SetPackageRestoreConsent(); } EnablePackageRestore(fromActivation); } catch (Exception ex) { exception = ex; ExceptionHelper.WriteToActivityLog(exception); } finally { int canceled; waitDialog.EndWaitDialog(out canceled); } if (fromActivation) { if (exception != null) { // show error message MessageHelper.ShowErrorMessage( VsResources.PackageRestoreErrorMessage + Environment.NewLine + Environment.NewLine + ExceptionUtility.Unwrap(exception).Message, VsResources.DialogTitle); } else { // show success message MessageHelper.ShowInfoMessage( VsResources.PackageRestoreCompleted, VsResources.DialogTitle); } } }
public Task RestoreMissingPackages() { TaskScheduler uiScheduler; try { uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); } catch (InvalidOperationException) { // this exception occurs during unit tests uiScheduler = TaskScheduler.Default; } Task task = Task.Factory.StartNew(() => { IVsPackageManager packageManager = _packageManagerFactory.CreatePackageManagerWithAllPackageSources(); IPackageRepository localRepository = packageManager.LocalRepository; var projectReferences = GetAllPackageReferences(packageManager); foreach (var reference in projectReferences) { if (!localRepository.Exists(reference.Id, reference.Version)) { // Resolve the package to install IPackage package = PackageRepositoryHelper.ResolvePackage( packageManager.SourceRepository, packageManager.LocalRepository, reference.Id, reference.Version, allowPrereleaseVersions: true); // Resolve actions var resolver = new ActionResolver() { Logger = packageManager.Logger, DependencyVersion = packageManager.DependencyVersion, IgnoreDependencies = true, AllowPrereleaseVersions = true }; resolver.AddOperation(PackageAction.Install, package, new NullProjectManager(packageManager)); var actions = resolver.ResolveActions(); // Execute actions var actionExecutor = new ActionExecutor() { Logger = packageManager.Logger }; actionExecutor.Execute(actions); } } }); task.ContinueWith(originalTask => { if (originalTask.IsFaulted) { ExceptionHelper.WriteToActivityLog(originalTask.Exception); } else { // we don't allow canceling Debug.Assert(!originalTask.IsCanceled); // after we're done with restoring packages, do the check again CheckForMissingPackages(); } }, uiScheduler); return(task); }