diff --git a/src/NuGet.Clients/NuGet.PackageManagement.VisualStudio/Projects/CpsPackageReferenceProject.cs b/src/NuGet.Clients/NuGet.PackageManagement.VisualStudio/Projects/CpsPackageReferenceProject.cs index 0f56230fda1..407dae9c709 100644 --- a/src/NuGet.Clients/NuGet.PackageManagement.VisualStudio/Projects/CpsPackageReferenceProject.cs +++ b/src/NuGet.Clients/NuGet.PackageManagement.VisualStudio/Projects/CpsPackageReferenceProject.cs @@ -43,14 +43,14 @@ public class CpsPackageReferenceProject : PackageReferenceProject _unconfiguredProject; public CpsPackageReferenceProject( string projectName, string projectUniqueName, string projectFullPath, IProjectSystemCache projectSystemCache, - UnconfiguredProject unconfiguredProject, + Microsoft.VisualStudio.Threading.AsyncLazy unconfiguredProject, INuGetProjectServices projectServices, string projectId) : base(projectName, @@ -269,7 +269,8 @@ public override async Task InstallPackageAsync( { // This is the "partial install" case. That is, install the package to only a subset of the frameworks // supported by this project. - var conditionalService = _unconfiguredProject + var unconfiguredProject = await _unconfiguredProject.GetValueAsync(token); + var conditionalService = unconfiguredProject .Services .ExportProvider .GetExportedValue(); @@ -315,7 +316,8 @@ await SetPackagePropertyValueAsync( else { // Install the package to all frameworks. - var configuredProject = await _unconfiguredProject.GetSuggestedConfiguredProjectAsync(); + var unconfiguredProject = await _unconfiguredProject.GetValueAsync(token); + var configuredProject = await unconfiguredProject.GetSuggestedConfiguredProjectAsync(); var result = await configuredProject .Services @@ -367,7 +369,8 @@ public override async Task UninstallPackageAsync(string packageId, BuildIn if (installationContext.SuccessfulFrameworks.Any() && installationContext.UnsuccessfulFrameworks.Any()) { - var conditionalService = _unconfiguredProject + var unconfiguredProject = await _unconfiguredProject.GetValueAsync(token); + var conditionalService = unconfiguredProject .Services .ExportProvider .GetExportedValue(); @@ -387,7 +390,8 @@ public override async Task UninstallPackageAsync(string packageId, BuildIn } else { - var configuredProject = await _unconfiguredProject.GetSuggestedConfiguredProjectAsync(); + var unconfiguredProject = await _unconfiguredProject.GetValueAsync(token); + var configuredProject = await unconfiguredProject.GetSuggestedConfiguredProjectAsync(); await configuredProject?.Services.PackageReferences.RemoveAsync(packageId); } diff --git a/src/NuGet.Clients/NuGet.PackageManagement.VisualStudio/Projects/CpsPackageReferenceProjectProvider.cs b/src/NuGet.Clients/NuGet.PackageManagement.VisualStudio/Projects/CpsPackageReferenceProjectProvider.cs index 4a93ced9548..d2789e5aed3 100644 --- a/src/NuGet.Clients/NuGet.PackageManagement.VisualStudio/Projects/CpsPackageReferenceProjectProvider.cs +++ b/src/NuGet.Clients/NuGet.PackageManagement.VisualStudio/Projects/CpsPackageReferenceProjectProvider.cs @@ -9,6 +9,7 @@ using Microsoft.VisualStudio.ProjectSystem; using Microsoft.VisualStudio.ProjectSystem.Properties; using Microsoft.VisualStudio.Shell; +using Microsoft.VisualStudio.Threading; using Microsoft.VisualStudio.Utilities; using NuGet.ProjectManagement; using NuGet.ProjectModel; @@ -80,16 +81,21 @@ public NuGetProject TryCreateNuGetProject( } var fullProjectPath = vsProject.FullProjectPath; - var unconfiguredProject = GetUnconfiguredProject(vsProject.Project); var projectServices = new CpsProjectSystemServices(vsProject, _scriptExecutor); + var lazyUnconfiguredProject = new AsyncLazy(async () => + { + await NuGetUIThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); + return GetUnconfiguredProject(vsProject.Project); + }, NuGetUIThreadHelper.JoinableTaskFactory); + return new CpsPackageReferenceProject( vsProject.ProjectName, vsProject.CustomUniqueName, fullProjectPath, _projectSystemCache, - unconfiguredProject, + lazyUnconfiguredProject, projectServices, vsProject.ProjectId); } diff --git a/test/NuGet.Clients.Tests/NuGet.PackageManagement.VisualStudio.Test/CpsPackageReferenceProjectTests.cs b/test/NuGet.Clients.Tests/NuGet.PackageManagement.VisualStudio.Test/CpsPackageReferenceProjectTests.cs index 4bcf31b6de8..5fa3276bfb8 100644 --- a/test/NuGet.Clients.Tests/NuGet.PackageManagement.VisualStudio.Test/CpsPackageReferenceProjectTests.cs +++ b/test/NuGet.Clients.Tests/NuGet.PackageManagement.VisualStudio.Test/CpsPackageReferenceProjectTests.cs @@ -4421,7 +4421,6 @@ public async Task GetPackageSpecsAndAdditionalMessagesAsync_NoRestoreInfoInSolut { // Arrange var projectSystemCache = new Mock(); - var unconfiguredProject = new Mock(); var nugetProjectServices = new Mock(); var projectGuid = Guid.NewGuid(); var cacheContext = new DependencyGraphCacheContext(); @@ -4432,7 +4431,7 @@ public async Task GetPackageSpecsAndAdditionalMessagesAsync_NoRestoreInfoInSolut @"src\TestProject\TestProject.csproj", @"c:\repo\src\TestProject\TestProject.csproj", projectSystemCache.Object, - unconfiguredProject.Object, + null, nugetProjectServices.Object, projectGuid.ToString()); diff --git a/test/NuGet.Clients.Tests/NuGet.PackageManagement.VisualStudio.Test/Services/NuGetProjectManagerServiceTests.cs b/test/NuGet.Clients.Tests/NuGet.PackageManagement.VisualStudio.Test/Services/NuGetProjectManagerServiceTests.cs index 4d67f61603d..4b91b0f48e3 100644 --- a/test/NuGet.Clients.Tests/NuGet.PackageManagement.VisualStudio.Test/Services/NuGetProjectManagerServiceTests.cs +++ b/test/NuGet.Clients.Tests/NuGet.PackageManagement.VisualStudio.Test/Services/NuGetProjectManagerServiceTests.cs @@ -157,13 +157,13 @@ await SimpleTestPackageUtility.CreateFolderFeedV3Async( Initialize(packageSources); - var unconfiguredProject = new Mock(); + var mockUnconfiguredProject = new Mock(); var configuredProject = new Mock(); var projectServices = new Mock(); var packageReferencesService = new Mock(); var result = new Mock(); - unconfiguredProject.Setup(x => x.GetSuggestedConfiguredProjectAsync()) + mockUnconfiguredProject.Setup(x => x.GetSuggestedConfiguredProjectAsync()) .ReturnsAsync(configuredProject.Object); configuredProject.SetupGet(x => x.Services) @@ -175,6 +175,9 @@ await SimpleTestPackageUtility.CreateFolderFeedV3Async( packageReferencesService.Setup(x => x.AddAsync(It.IsNotNull(), It.IsNotNull())) .ReturnsAsync(new AddReferenceResult(result.Object, added: true)); + var unconfiguredProject = new Microsoft.VisualStudio.Threading.AsyncLazy( + () => Task.FromResult(mockUnconfiguredProject.Object)); + var nuGetProjectServices = new Mock(); nuGetProjectServices.SetupGet(x => x.ScriptService) @@ -188,7 +191,7 @@ await SimpleTestPackageUtility.CreateFolderFeedV3Async( projectUniqueName: projectFullPath, projectFullPath: projectFullPath, projectSystemCache, - unconfiguredProject.Object, + unconfiguredProject, nuGetProjectServices.Object, projectId); @@ -429,13 +432,13 @@ await SimpleTestPackageUtility.CreateFolderFeedV3Async( Initialize(packageSources); - var unconfiguredProject = new Mock(); + var mockUnconfiguredProject = new Mock(); var configuredProject = new Mock(); var projectServices = new Mock(); var packageReferencesService = new Mock(); var result = new Mock(); - unconfiguredProject.Setup(x => x.GetSuggestedConfiguredProjectAsync()) + mockUnconfiguredProject.Setup(x => x.GetSuggestedConfiguredProjectAsync()) .ReturnsAsync(configuredProject.Object); configuredProject.SetupGet(x => x.Services) @@ -447,6 +450,9 @@ await SimpleTestPackageUtility.CreateFolderFeedV3Async( packageReferencesService.Setup(x => x.AddAsync(It.IsNotNull(), It.IsNotNull())) .ReturnsAsync(new AddReferenceResult(result.Object, added: true)); + var unconfiguredProject = new Microsoft.VisualStudio.Threading.AsyncLazy( + () => Task.FromResult(mockUnconfiguredProject.Object)); + var nuGetProjectServices = new Mock(); nuGetProjectServices.SetupGet(x => x.ScriptService) @@ -460,7 +466,7 @@ await SimpleTestPackageUtility.CreateFolderFeedV3Async( projectUniqueName: projectFullPath, projectFullPath: projectFullPath, projectSystemCache, - unconfiguredProject.Object, + unconfiguredProject, nuGetProjectServices.Object, projectId); diff --git a/test/TestUtilities/VisualStudio.Test.Utility/TestCpsPackageReferenceProject.cs b/test/TestUtilities/VisualStudio.Test.Utility/TestCpsPackageReferenceProject.cs index 533ddefd394..a9bb9985ee2 100644 --- a/test/TestUtilities/VisualStudio.Test.Utility/TestCpsPackageReferenceProject.cs +++ b/test/TestUtilities/VisualStudio.Test.Utility/TestCpsPackageReferenceProject.cs @@ -51,7 +51,7 @@ private TestCpsPackageReferenceProject( string projectUniqueName, string projectFullPath, IProjectSystemCache projectSystemCache, - UnconfiguredProject unconfiguredProject, + Microsoft.VisualStudio.Threading.AsyncLazy unconfiguredProject, INuGetProjectServices projectServices, string projectId, string assetsFilePath,