private async Task <Dictionary <PackageReference, List <string> > > GetPackagesReferencesDictionaryAsync(CancellationToken token) { var packageReferencesDict = new Dictionary <PackageReference, List <string> >(new PackageReferenceComparer()); if (!await SolutionManager.IsSolutionAvailableAsync()) { return(packageReferencesDict); } foreach (var nuGetProject in (await SolutionManager.GetNuGetProjectsAsync())) { // skip project k projects and build aware projects if (nuGetProject is INuGetIntegratedProject) { continue; } var nuGetProjectName = NuGetProject.GetUniqueNameOrName(nuGetProject); var installedPackageReferences = await nuGetProject.GetInstalledPackagesAsync(token); foreach (var installedPackageReference in installedPackageReferences) { List <string> projectNames = null; if (!packageReferencesDict.TryGetValue(installedPackageReference, out projectNames)) { projectNames = new List <string>(); packageReferencesDict.Add(installedPackageReference, projectNames); } projectNames.Add(nuGetProjectName); } } return(packageReferencesDict); }
public async Task CleanCacheAsync() { // get all build integrated based nuget projects and delete the cache file. await Task.WhenAll( (await SolutionManager.GetNuGetProjectsAsync()).OfType <BuildIntegratedNuGetProject>().Select(async e => Common.FileUtility.Delete(await e.GetCacheFilePathAsync()))); Interlocked.Exchange(ref _restoreJobContext, new SolutionRestoreJobContext()); }
private void BeforeQueryStatusForAddPackageForSolutionDialog(object sender, EventArgs args) { NuGetUIThreadHelper.JoinableTaskFactory.Run(async delegate { await NuGetUIThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); var command = (OleMenuCommand)sender; // Enable the 'Manage NuGet Packages For Solution' dialog menu // - if the console is NOT busy executing a command, AND // - if the solution exists and not debugging and not building AND // - if there are NuGetProjects. This means there are loaded, supported projects. command.Enabled = IsSolutionExistsAndNotDebuggingAndNotBuilding() && !ConsoleStatus.Value.IsBusy && (await SolutionManager.GetNuGetProjectsAsync()).Any(); }); }
private async Task <IVsWindowFrame> CreateDocWindowForSolutionAsync() { ThreadHelper.ThrowIfNotOnUIThread(); IVsWindowFrame windowFrame = null; var solution = await this.GetServiceAsync <IVsSolution>(); var uiShell = await this.GetServiceAsync <SVsUIShell, IVsUIShell>(); var windowFlags = (uint)_VSRDTFLAGS.RDT_DontAddToMRU | (uint)_VSRDTFLAGS.RDT_DontSaveAs; if (!await SolutionManager.IsSolutionAvailableAsync()) { throw new InvalidOperationException(Resources.SolutionIsNotSaved); } var projects = await SolutionManager.GetNuGetProjectsAsync(); if (!projects.Any()) { // NOTE: The menu 'Manage NuGet Packages For Solution' will be disabled in this case. // But, it is possible, that, before NuGetPackage is loaded in VS, the menu is enabled and used. // For once, this message will be shown. Once the package is loaded, the menu will get disabled as appropriate MessageHelper.ShowWarningMessage(Resources.NoSupportedProjectsInSolution, Resources.ErrorDialogBoxTitle); return(null); } // load packages.config. This makes sure that an exception will get thrown if there // are problems with packages.config, such as duplicate packages. When an exception // is thrown, an error dialog will pop up and this doc window will not be created. foreach (var project in projects) { await project.GetInstalledPackagesAsync(CancellationToken.None); } var uiController = UIFactory.Create(projects.ToArray()); var solutionName = (string)_dte.Solution.Properties.Item("Name").Value; var model = new PackageManagerModel( uiController, isSolution: true, editorFactoryGuid: GuidList.guidNuGetEditorType) { SolutionName = solutionName }; var vsWindowSearchHostfactory = await GetServiceAsync(typeof(SVsWindowSearchHostFactory)) as IVsWindowSearchHostFactory; var vsShell = await GetServiceAsync(typeof(SVsShell)) as IVsShell4; var control = new PackageManagerControl(model, Settings.Value, vsWindowSearchHostfactory, vsShell, OutputConsoleLogger); var windowPane = new PackageManagerWindowPane(control); var guidEditorType = GuidList.guidNuGetEditorType; var guidCommandUI = Guid.Empty; var caption = Resx.Label_SolutionNuGetWindowCaption; var documentName = _dte.Solution.FullName; var ppunkDocView = IntPtr.Zero; var ppunkDocData = IntPtr.Zero; var hr = 0; try { ppunkDocView = Marshal.GetIUnknownForObject(windowPane); ppunkDocData = Marshal.GetIUnknownForObject(model); hr = uiShell.CreateDocumentWindow( windowFlags, documentName, (IVsUIHierarchy)solution, (uint)VSConstants.VSITEMID.Root, ppunkDocView, ppunkDocData, ref guidEditorType, null, ref guidCommandUI, null, caption, string.Empty, null, out windowFrame); } finally { if (ppunkDocView != IntPtr.Zero) { Marshal.Release(ppunkDocData); } if (ppunkDocData != IntPtr.Zero) { Marshal.Release(ppunkDocView); } } ErrorHandler.ThrowOnFailure(hr); return(windowFrame); }
private async Task <IVsWindowFrame> CreateDocWindowForSolutionAsync() { ThreadHelper.ThrowIfNotOnUIThread(); IVsWindowFrame windowFrame = null; var solution = await this.GetServiceAsync <IVsSolution>(); var uiShell = await this.GetServiceAsync <SVsUIShell, IVsUIShell>(); var windowFlags = (uint)_VSRDTFLAGS.RDT_DontAddToMRU | (uint)_VSRDTFLAGS.RDT_DontSaveAs; if (await SolutionManager.SolutionHasDeferredProjectsAsync() && !SolutionManager.IsInitialized) { // when VSSolutionManager is not yet initialized, then do a quick pre-condition checks without initializing it fully // which might take some time so we'll initialize it after showing the manager ui window. var preCheckResult = await SolutionManager.CheckSolutionUIPreConditionsAsync(); // key represent if solution is available or not. if (!preCheckResult.Key) { throw new InvalidOperationException(Resources.SolutionIsNotSaved); } // value represent if there is any project in the solution which NuGet supports. if (!preCheckResult.Value) { // NOTE: The menu 'Manage NuGet Packages For Solution' will be disabled in this case. // But, it is possible, that, before NuGetPackage is loaded in VS, the menu is enabled and used. // For once, this message will be shown. Once the package is loaded, the menu will get disabled as appropriate MessageHelper.ShowWarningMessage(Resources.NoSupportedProjectsInSolution, Resources.ErrorDialogBoxTitle); return(null); } } else { // when VSSolutionManager is already initialized, then use the existing APIs to check pre-conditions. if (!await SolutionManager.IsSolutionAvailableAsync()) { throw new InvalidOperationException(Resources.SolutionIsNotSaved); } var projects = await SolutionManager.GetNuGetProjectsAsync(); if (!projects.Any()) { MessageHelper.ShowWarningMessage(Resources.NoSupportedProjectsInSolution, Resources.ErrorDialogBoxTitle); return(null); } } // pass empty array of NuGetProject var uiController = UIFactory.Create(new NuGetProject[0]); var solutionName = (string)_dte.Solution.Properties.Item("Name").Value; var model = new PackageManagerModel( uiController, isSolution: true, editorFactoryGuid: GuidList.guidNuGetEditorType) { SolutionName = solutionName }; var vsWindowSearchHostfactory = await GetServiceAsync(typeof(SVsWindowSearchHostFactory)) as IVsWindowSearchHostFactory; var vsShell = await GetServiceAsync(typeof(SVsShell)) as IVsShell4; var control = new PackageManagerControl(model, Settings.Value, vsWindowSearchHostfactory, vsShell, OutputConsoleLogger); var windowPane = new PackageManagerWindowPane(control); var guidEditorType = GuidList.guidNuGetEditorType; var guidCommandUI = Guid.Empty; var caption = Resx.Label_SolutionNuGetWindowCaption; var documentName = _dte.Solution.FullName; var ppunkDocView = IntPtr.Zero; var ppunkDocData = IntPtr.Zero; var hr = 0; try { ppunkDocView = Marshal.GetIUnknownForObject(windowPane); ppunkDocData = Marshal.GetIUnknownForObject(model); hr = uiShell.CreateDocumentWindow( windowFlags, documentName, (IVsUIHierarchy)solution, (uint)VSConstants.VSITEMID.Root, ppunkDocView, ppunkDocData, ref guidEditorType, null, ref guidCommandUI, null, caption, string.Empty, null, out windowFrame); } finally { if (ppunkDocView != IntPtr.Zero) { Marshal.Release(ppunkDocData); } if (ppunkDocData != IntPtr.Zero) { Marshal.Release(ppunkDocView); } } ErrorHandler.ThrowOnFailure(hr); return(windowFrame); }