public IEnumerable <IVsPackageMetadata> GetInstalledPackages()
        {
            const string eventName = nameof(IVsPackageInstallerServices) + "." + nameof(GetInstalledPackages);

            using var _ = NuGetETW.ExtensibilityEventSource.StartStopEvent(eventName);
            try
            {
                var packages = new HashSet <IVsPackageMetadata>(new VsPackageMetadataComparer());

                return(_threadingService.JoinableTaskFactory.Run(async delegate
                {
                    // Calls may occur in the template wizard before the solution is actually created,
                    // in that case return no projects
                    if (_solutionManager != null &&
                        !string.IsNullOrEmpty(await _solutionManager.GetSolutionDirectoryAsync()))
                    {
                        //switch to background thread
                        await TaskScheduler.Default;

                        NuGetPackageManager nuGetPackageManager = CreateNuGetPackageManager();

                        foreach (var project in (await _solutionManager.GetNuGetProjectsAsync()))
                        {
                            FallbackPackagePathResolver pathResolver = null;
                            var buildIntegratedProject = project as BuildIntegratedNuGetProject;
                            if (buildIntegratedProject != null)
                            {
                                pathResolver = await GetPackagesPathResolverAsync(buildIntegratedProject);
                            }

                            var installedPackages = await project.GetInstalledPackagesAsync(CancellationToken.None);

                            foreach (var package in installedPackages)
                            {
                                var identity = package.PackageIdentity;

                                if (!identity.HasVersion)
                                {
                                    // Currently we are not supporting floating versions
                                    // because of that we will skip this package
                                    continue;
                                }

                                // find packages using the solution level packages folder
                                string installPath;
                                if (buildIntegratedProject != null)
                                {
                                    installPath = pathResolver.GetPackageDirectory(identity.Id, identity.Version);
                                }
                                else
                                {
                                    installPath = nuGetPackageManager
                                                  .PackagesFolderNuGetProject
                                                  .GetInstalledPath(identity);
                                }

                                var metadata = new VsPackageMetadata(package.PackageIdentity, installPath);

                                packages.Add(metadata);
                            }
                        }
                    }

                    return packages;
                }));
            }
            catch (Exception exception)
            {
                _telemetryProvider.PostFault(exception, typeof(VsPackageInstallerServices).FullName);
                throw;
            }
        }
        public IEnumerable <IVsPackageMetadata> GetInstalledPackages(Project project)
        {
            const string eventName = nameof(IVsPackageInstallerServices) + "." + nameof(GetInstalledPackages) + ".1";

            using var _ = NuGetETW.ExtensibilityEventSource.StartStopEvent(eventName);

            if (project == null)
            {
                throw new ArgumentNullException(nameof(project));
            }

            try
            {
                return(_threadingService.JoinableTaskFactory.Run(async delegate
                {
                    var packages = new List <IVsPackageMetadata>();

                    if (_solutionManager != null &&
                        !string.IsNullOrEmpty(await _solutionManager.GetSolutionDirectoryAsync()))
                    {
                        //switch to background thread
                        await TaskScheduler.Default;

                        NuGetPackageManager nuGetPackageManager = CreateNuGetPackageManager();

                        var projectContext = new VSAPIProjectContext
                        {
                            PackageExtractionContext = new PackageExtractionContext(
                                PackageSaveMode.Defaultv2,
                                PackageExtractionBehavior.XmlDocFileSaveMode,
                                ClientPolicyContext.GetClientPolicy(_settings, NullLogger.Instance),
                                NullLogger.Instance)
                        };

                        var nuGetProject = await _solutionManager.GetOrCreateProjectAsync(
                            project,
                            projectContext);

                        if (nuGetProject != null)
                        {
                            FallbackPackagePathResolver pathResolver = null;
                            var buildIntegratedProject = nuGetProject as BuildIntegratedNuGetProject;
                            if (buildIntegratedProject != null)
                            {
                                pathResolver = await GetPackagesPathResolverAsync(buildIntegratedProject);
                            }

                            var installedPackages = await nuGetProject.GetInstalledPackagesAsync(CancellationToken.None);

                            foreach (var package in installedPackages)
                            {
                                if (!package.PackageIdentity.HasVersion)
                                {
                                    // Currently we are not supporting floating versions
                                    // because of that we will skip this package so that it doesn't throw ArgumentNullException
                                    continue;
                                }

                                string installPath;
                                if (buildIntegratedProject != null)
                                {
                                    installPath = pathResolver.GetPackageDirectory(package.PackageIdentity.Id, package.PackageIdentity.Version);
                                }
                                else
                                {
                                    // Get the install path for package
                                    installPath = nuGetPackageManager.PackagesFolderNuGetProject.GetInstalledPath(
                                        package.PackageIdentity);

                                    if (!string.IsNullOrEmpty(installPath))
                                    {
                                        // normalize the path and take the dir if the nupkg path was given
                                        var dir = new DirectoryInfo(installPath);
                                        installPath = dir.FullName;
                                    }
                                }

                                var metadata = new VsPackageMetadata(package.PackageIdentity, installPath);
                                packages.Add(metadata);
                            }
                        }
                    }

                    return packages;
                }));
            }
            catch (Exception exception)
            {
                _telemetryProvider.PostFault(exception, typeof(VsPackageInstallerServices).FullName);
                throw;
            }
        }