NuGet-API in Visual Studio

Zusätzlich zur Benutzeroberfläche des Paket-Managers und zur Paket-Manager-Konsole in Visual Studio exportiert NuGet auch einige nützliche Dienste, die andere Erweiterungen verwenden können. Diese Schnittstellen ermöglichen anderen Komponenten in Visual Studio die Interaktion mit NuGet, über die Pakete installiert und deinstalliert werden können und Informationen zu installierten Paketen abgerufen werden können.

NuGet stellt Dienste über zwei verschiedene Technologien bereit, von denen jede ihre Schnittstellen in einem anderen NuGet-Paket definiert hat. Die älteren Dienste von NuGet sind über das Managed Extensibility Framework (MEF) verfügbar, das im Paket NuGet.VisualStudio vorhanden ist (wechseln Sie zu den MEF-Diensten von NuGet). Es gibt neuere APIs, die für die Verwendung mit async Code konzipiert sind, die im Paket NuGet.VisualStudio.Contracts verfügbar sind, mithilfe der Visual Studio-Dienste IServiceBroker (wechseln Sie zu den Brokered Services von NuGet).

Paketversionen

Das Produkt von NuGet folgt der Version von Visual Studio, ist jedoch 11.0-Versionen zurück. Beispielsweise, entspricht NuGet 6.0 Visual Studio 2022 17.0, NuGet 5.11 entspricht Visual Studio 2019 16.11 usw.

Ab Visual Studio 17.1 entsprechen die Visual Studio-Erweiterungs-API-Pakete von NuGet der Version von Visual Studio, auf die die APIs ausgerichtet sind. Beispielsweise sollte NuGet.VisualStudio und NuGet.VisualStudio.Contracts-Paketversion 17.1.0 verwendet werden, wenn Ihre Erweiterung auf Visual Studio 17.1 und höher ausgerichtet ist. In Visual Studio 17.0 und früheren Versionen sind die Paketversionen von NuGet mit der Produktversion von NuGet identisch. Wenn Ihre Erweiterung beispielsweise auf Visual Studio 2022, Version 17.0, ausgerichtet ist, sollten Sie Version 6.0 der Visual Studio-Erweiterbarkeitspakete von NuGet verwenden.

NuGet Client SDK in Visual Studio-Erweiterungen

Nur die APIs in NuGet.VisualStudio und NuGet.VisualStudio.Contracts werden in Visual Studio-Erweiterungen unterstützt. NuGet stellt für diese Assemblys Bindungsumleitungen bereit, so dass diese Assemblys nicht in Ihre Erweiterung aufgenommen werden müssen.

Die Verwendung von NuGet-Client-SDK-Paketen, z. B. NuGet.Protocol, wird in Visual Studio-Erweiterungen nicht unterstützt. NuGet stellt keine Bindungsumleitungen für diese Assemblys bereit. Weitere Informationen finden Sie in der NuGet-Client-SDK-Unterstützungsrichtlinie.

Dienstliste

Vermittelte Dienste

Diese Dienste sind im Paket NuGet.VisualStudio.Contracts verfügbar.

MEF-Dienste

Von NuGet 6.0 sind alle diese APIs im Paket NuGet.VisualStudio verfügbar. In NuGet 5.11 und früheren Versionen sind die APIs im Namespace NuGet.VisualStudio im Paket NuGet.VisualStudio verfügbar, und APIs im Namespace NuGet.SolutionRestoreManager sind im Paket NuGet.SolutionRestoreManager.Interop verfügbar.

NuGet.VisualStudio

  • IRegistryKey: Eine Methode zum Abrufen eines Werts aus einem Registrierungsunterschlüssel. (3.3 und höher)
  • IVsCredentialProvider: Diese Schnittstelle enthält Methoden zum Abrufe von Anmeldeinformationen für NuGet-Vorgänge. (4.0 und höher)
  • IVsFrameworkCompatibility: Diese Schnittstelle enthält Methoden zum Ermitteln des Frameworks und der Kompatibilität zwischen Frameworks. (4.0 und höher)
  • IVsFrameworkCompatibility2: Diese Schnittstelle enthält Methoden zum Ermitteln des Frameworks und der Kompatibilität zwischen Frameworks. (4.0 und höher)
  • IVsFrameworkCompatibility3: Diese Schnittstelle enthält Methoden zum Ermitteln des Frameworks und der Kompatibilität zwischen Frameworks. (5.8 und höher)
  • IVsFrameworkParser: Hierbei handelt es sich um eine Schnittstelle zur Verarbeitung der Konvertierung zwischen Zeichenfolgen und FrameworkName. (4.0 und höher)
  • IVsFrameworkParser2: Hierbei handelt es sich um eine Schnittstelle zum Analysieren von .NET Framework-Zeichenfolgen. Weitere Informationen finden Sie unter NuGet-IVsFrameworkParser. (5.8 und höher)
  • IVsGlobalPackagesInitScriptExecutor: Hierbei werden PowerShell-Skripts in einer Projektmappe auf Grundlage von Paketen ausgeführt. (Version 4.0 und höher)
  • IVsPackageInstaller: Methoden zum Installieren von NuGet-Pakete in Projekten. (3.3 und höher)
  • `IVsPackageInstaller2: Diese Schnittstelle enthält eine Methode zum Installieren der aktuellen Version eines einzelnen Pakets in einem Projekt der aktuellen Projektmappe.
  • IVsPackageInstallerEvents: Ereignisse für das Installieren/Deinstallieren von Paketen. (3.3 und höher)
  • IVsPackageInstallerProjectEvents: Batchereignisse für das Installieren/Deinstallieren von Paketen. (3.3 und höher)
  • IVsPackageInstallerServices: Methoden zum Abrufen installierter Pakete in der aktuellen Projektmappe und zum Überprüfen, ob ein bestimmtes Paket in einem Projekt installiert wurde. (3.3 und höher)
  • IVsPackageManagerProvider: Methoden zur Bereitstellung alternativer Paket-Manager-Vorschläge für ein NuGet-Paket. (3.3 - 5.11)
  • IVsPackageRestorer: Methoden zum Wiederherstellen von Paketen, die in einem Projekt installiert sind. (3.3 und höher)
  • IVsPackageSourceProvider: Methoden zum Abrufen einer Liste von NuGet-Paketquellen. (3.3 und höher)
  • IVsPackageUninstaller: Methoden zum Deinstallieren von NuGet-Paketen aus Projekten. (3.3 und höher)
  • IVsPathContext: Bei dieser Schnittstelle handelt es sich um NuGet-Paketinformationen, die für den aktuellen Kontext spezifisch sind (z. B. Projektkontext). (4.0 und höher)
  • IVsPathContext2: Bei dieser Schnittstelle handelt es sich um NuGet-Paketinformationen, die für den aktuellen Kontext spezifisch sind (z. B. Projektkontext). (5.0 und höher)
  • IVsPathContextProvider Hierbei handelt es sich um eine Factory zum Initialisieren von IVsPathContext-Instanzen. (4.0 und höher)
  • IVsPathContextProvider2 Hierbei handelt es sich um eine Factory zum Initialisieren von IVsPathContext2-Instanzen. (5.0 und höher)
  • IVsProjectJsonToPackageReferenceMigrator Diese Schnittstelle enthält Methoden zum Migrieren eines project.json-Legacyprojekts in ein auf PackageReference basierendes Projekt. (4.3 und höher)
  • IVsSemanticVersionComparer: Hierbei handelt es sich um eine Schnittstelle für das Vergleichen zweier opaker Versionszeichenfolgen, indem die Verarbeitung als NuGet-Semantik erfolgt. (4.0 und höher)
  • IVsNuGetProjectUpdateEvents (6.2 und höher)

NuGet.SolutionRestoreManager

Diese Schnittstellen sind für die Interaktion mit NuGet konzipiert, sodass das Projektsystem NuGet über Änderungen an PackageReference benachrichtigt und Batchupdates koordiniert. Visual Studio-Erweiterungen, die keine Projektsysteme sind, profitieren wahrscheinlich nicht von diesen APIs.

Verwenden von NuGet-Diensten

Warnung

Verwenden Sie neben den öffentlichen Schnittstellen in Ihrem Code keine weiteren Typen, und verweisen Sie auf keine anderen NuGet-Assemblys, wie NuGet.Protocol.dll, NuGet.Frameworks.dll, usw..

Um die Von uns vorgenommenen Zusagen der Abwärtskompatibilität zu maximieren, aber auch die Flexibilität zur Implementierung neuer Features, Leistungsverbesserungen und Bugfixes in Visual Studio bieten wir keine Unterstützung für das NuGet Client SDK, das in Visual Studio verwendet wird, und wir stellen keine Bindungsumleitungen in devenv.exe.config anderen Assemblys als unsere VS-Erweiterbarkeitsverträge bereit.

Wenn Sie eine neue NuGet-verwandte API in Visual Studio wünschen, suchen Sie bitte das Home-Repository von NuGet, und stimmen Sie allen vorhandenen Probleme zu, wenn Sie eine ähnliche finden. Wenn Sie eine vorhandene Feature-Anforderung zum Zustimmen nicht finden können, erstellen Sie eine.

Vermittelte Dienste

  1. Installiere das NuGet.VisualStudio.Contracts Paket in deinem Projekt, wie Microsoft.VisualStudio.SDK.

  2. Verwenden Sie den IAsyncServiceProvider Service Broker von Visual Studio und nutzen Sie diese, um den Dienst von NuGet abzurufen. Beachten Sie, dass AsyncPackage erweitert IVsAsyncServiceProvider2wird, sodass Ihre Klasse, die AsyncPackage implementiert, als IAsyncServiceProvider verwendet werden kann. Sehen Sie sich auch die Dokumente in IBrokeredServiceContainer und IServiceBroker an

    // Your AsyncPackage implements IAsyncServiceProvider
    IAsyncServiceProvider asyncServiceProvider = this;
    var brokeredServiceContainer = await asyncServiceProvider.GetServiceAsync<SVsBrokeredServiceContainer, IBrokeredServiceContainer>();
    var serviceBroker = brokeredServiceContainer.GetFullAccessServiceBroker();
    var nugetProjectService = await serviceBroker.GetProxyAsync<INuGetProjectService>(NuGetServices.NuGetProjectServiceV1);
    
  3. Wenn Ihr Code den vermittelten Dienst von NuGet nicht mehr benötigt, löschen Sie ihn. Wenn Sie z. B. nur den vermittelten Dienst von NuGet während eines einzelnen Methodenaufrufs benötigen, können Sie ihn in eine C#using -Anweisung einschließen:

    InstalledPackagesResult installedPackagesResult;
    using (nugetProjectService as IDisposable)
    {
        installedPackagesResult = await nugetProjectService.GetInstalledPackages(projectGuid, cancellationToken);
    }
    

MEF-Dienste

  1. Installieren Sie das Paket NuGet.VisualStudio in Ihrem Projekt, das die Assembly NuGet.VisualStudio.dll enthält.

    In NuGet 5.11 und älter , wird nach Abschluss der Installation die Eigenschaft Interop-Typen einbetten des Assemblyverweises im Paket automatisch auf True festgelegt. Die Visual Studio 2022-Richtlinie für Einbettungs-Interoperabilitätstypen wurde geändert, sodass NuGet.VisualStudio-Paketversion 6.0.0 und höher dies nicht mehr verwenden.

  2. Wenn Sie einen Dienst verwenden möchten, importieren Sie diesen über das Attribut „MEF-Import“ oder über den IComponentModel-Dienst.

    //Using the Import attribute
    [Import(typeof(IVsPackageInstaller2))]
    public IVsPackageInstaller2 packageInstaller;
    packageInstaller.InstallLatestPackage(null, currentProject,
        "Newtonsoft.Json", false, false);
    
    //Using the IComponentModel service
    var componentModel = (IComponentModel)GetService(typeof(SComponentModel));
    IVsPackageInstallerServices installerServices =
        componentModel.GetService<IVsPackageInstallerServices>();
    
    var installedPackages = installerServices.GetInstalledPackages();
    

Zu Referenzzwecken befindet sich der Quellcode für NuGet.VisualStudio im NuGet.Clients-Repository.

Grundlegendes zu .NET-Projektsystemen

Als SDK-Stilprojekte für .NET Core 1.0 hinzugefügt wurden, wurden sie so konzipiert, dass sie asynchroner als vorherige Visual Studio-Projektsysteme sind. Dies wirkt sich darauf aus, wie alle anderen Visual Studio-Komponenten, oder andere Komponenten wie NuGet, direkt damit interagieren. Dies ist besonders auffällig bei der Lösungslade und Projektlade, bei der Projekte einige Zeit nicht vollständig verfügbar sind, nachdem die älteren synchronen API-Benachrichtigungen von Visual Studio bereits ausgelöst wurden.

Beim Laden der Lösung ignoriert NuGet IVsSolutionEvents.OnAfterProjectLoad, um eine Verzögerung des synchronen Teils der Lösungslade zu vermeiden. NuGet synchronisiert seine internen Datenstrukturen, nachdem der synchrone Teil der Lösungsladevorgang abgeschlossen wurde. Dies gilt auch für Projekte im Nicht-SDK-Stil.

Selbst wenn alle IVsSolutionEvents.OnAfterSolutionLoad Ereignishandler fertig sind, signalisiert dies nur das Ende des synchronen Teils der Lösungslade. Der asynchrone Teil des Lösungsladevorgangs wird noch ausgeführt. Wenn Ihre Erweiterung NuGet-APIs wie GetInstalledPackagesAsync oder InstallPackage bald nach dem Laden von Projekten oder Lösungen aufruft, löst NuGet möglicherweise eine InvalidOperationException mit der Meldung „Fehler beim Vorgang als Details für Projekt {Projektname} konnte nicht geladen werden“.

Wenn eine Lösung mindestens ein SDK-Stilprojekt enthält, führt NuGet automatisch eine Wiederherstellung nach dem Laden der Lösung durch, und Sie sollten keine Nuget-APIs aufrufen, bis dies abgeschlossen ist. Sie können IVsNuGetProjectUpdateEvents verwenden, um eine Benachrichtigung zu erhalten, wenn die Wiederherstellung der Lösung oder eines bestimmten Projekts abgeschlossen ist. Wenn eine Lösung keine SDK-Stilprojekte enthält, wird die Wiederherstellung nicht automatisch geplant und kann erst erfolgen, wenn ein Build geplant ist.

Um zu ermitteln, ob ein Projekt den asynchronen Fluss (SDK-Stilprojekt) von NuGet verwendet, verwenden Sie PackageUtilities.IsCapabilityMatch mit dem Ausdruck CPS + PackageReference.

INuGetProjectService-Schnittstelle

    /// <summary>Service to interact with projects in a solution</summary>
    /// <remarks>This interface should not be implemented. New methods may be added over time.</remarks>
    public interface INuGetProjectService
    {
        /// <Summary>Gets the list of packages installed in a project.</Summary>
        /// <param name="projectId">Project ID (GUID).</param>
        /// <param name="cancellationToken">Cancellation token.</param>
        /// <returns>The list of packages in the project.</returns>
        Task<InstalledPackagesResult> GetInstalledPackagesAsync(Guid projectId, CancellationToken cancellationToken);
    }

IRegistryKey-Schnittstelle

/// <summary>
/// Specifies methods for manipulating a key in the Windows registry.
/// </summary>
public interface IRegistryKey
    {
    /// <summary>
    /// Retrieves the specified subkey for read or read/write access.
    /// </summary>
    /// <param name="name">The name or path of the subkey to create or open.</param>
    /// <returns>The subkey requested, or null if the operation failed.</returns>
    IRegistryKey OpenSubKey(string name);


    /// <summary>
    /// Retrieves the value associated with the specified name.
    /// </summary>
    /// <param name="name">The name of the value to retrieve. This string is not case-sensitive.</param>
    /// <returns>The value associated with name, or null if name is not found.</returns>
    object GetValue(string name);


    /// <summary>
    /// Closes the key and flushes it to disk if its contents have been modified.
    /// </summary>
    void Close();
}

IVsCredentialProvider-Schnittstelle

    /// <summary>
    /// Contains methods to get credentials for NuGet operations.
    /// </summary>
    public interface IVsCredentialProvider
    {
        /// <summary>
        /// Get credentials for the supplied package source Uri.
        /// </summary>
        /// <param name="uri">The NuGet package source Uri for which credentials are being requested. Implementors are
        /// expected to first determine if this is a package source for which they can supply credentials.
        /// If not, then Null should be returned.</param>
        /// <param name="proxy">Web proxy to use when comunicating on the network.  Null if there is no proxy
        /// authentication configured.</param>
        /// <param name="isProxyRequest">True if if this request is to get proxy authentication
        /// credentials. If the implementation is not valid for acquiring proxy credentials, then
        /// null should be returned.</param>
        /// <param name="isRetry">True if credentials were previously acquired for this uri, but
        /// the supplied credentials did not allow authorized access.</param>
        /// <param name="nonInteractive">If true, then interactive prompts must not be allowed.</param>
        /// <param name="cancellationToken">This cancellation token should be checked to determine if the
        /// operation requesting credentials has been cancelled.</param>
        /// <returns>Credentials acquired by this provider for the given package source uri.
        /// If the provider does not handle requests for the input parameter set, then null should be returned.
        /// If the provider does handle the request, but cannot supply credentials, an exception should be thrown.</returns>
        Task<ICredentials> GetCredentialsAsync(Uri uri,
            IWebProxy proxy,
            bool isProxyRequest,
            bool isRetry,
            bool nonInteractive,
            CancellationToken cancellationToken);
    }

IVsFrameworkCompatibility-Schnittstelle

    /// <summary>
    /// Contains methods to discover frameworks and compatibility between frameworks.
    /// </summary>
    public interface IVsFrameworkCompatibility
    {
        /// <summary>
        /// Gets all .NETStandard frameworks currently supported, in ascending order by version.
        /// </summary>
        /// <remarks>This API is <a href="https://github.com/microsoft/vs-threading/blob/main/doc/cookbook_vs.md#how-do-i-effectively-verify-that-my-code-is-fully-free-threaded">free-threaded.</a></remarks>
        IEnumerable<FrameworkName> GetNetStandardFrameworks();

        /// <summary>
        /// Gets frameworks that support packages of the provided .NETStandard version.
        /// </summary>
        /// <remarks>
        /// The result list is not exhaustive as it is meant to human-readable. For example,
        /// equivalent frameworks are not returned. Additionally, a framework name with version X
        /// in the result implies that framework names with versions greater than or equal to X
        /// but having the same <see cref="FrameworkName.Identifier"/> are also supported.
        ///
        /// <para>This API is <a href="https://github.com/microsoft/vs-threading/blob/main/doc/cookbook_vs.md#how-do-i-effectively-verify-that-my-code-is-fully-free-threaded">free-threaded.</a></para>
        /// </remarks>
        /// <param name="frameworkName">The .NETStandard version to get supporting frameworks for.</param>
        [Obsolete("This API does not support .NET 5 and higher target frameworks with platforms. Use IVsFrameworkCompatibility3 instead.")]
        IEnumerable<FrameworkName> GetFrameworksSupportingNetStandard(FrameworkName frameworkName);

        /// <summary>
        /// Selects the framework from <paramref name="frameworks"/> that is nearest
        /// to the <paramref name="targetFramework"/>, according to NuGet's framework
        /// compatibility rules. <c>null</c> is returned of none of the frameworks
        /// are compatible.
        /// </summary>
        /// <remarks>This API is <a href="https://github.com/microsoft/vs-threading/blob/main/doc/cookbook_vs.md#how-do-i-effectively-verify-that-my-code-is-fully-free-threaded">free-threaded.</a></remarks>
        /// <param name="targetFramework">The target framework.</param>
        /// <param name="frameworks">The list of frameworks to choose from.</param>
        /// <exception cref="ArgumentException">If any of the arguments are <c>null</c>.</exception>
        /// <returns>The nearest framework.</returns>
        [Obsolete("This API does not support .NET 5 and higher target frameworks with platforms. Use IVsFrameworkCompatibility3 instead.")]
        FrameworkName GetNearest(FrameworkName targetFramework, IEnumerable<FrameworkName> frameworks);
    }

IVsFrameworkCompatibility2-Schnittstelle

    /// <summary>
    /// Contains methods to discover frameworks and compatibility between frameworks.
    /// </summary>
    [Obsolete("This API does not support .NET 5 and higher target frameworks with platforms. Use IVsFrameworkCompatibility3 instead.")]
    public interface IVsFrameworkCompatibility2 : IVsFrameworkCompatibility
    {
        /// <summary>
        /// Selects the framework from <paramref name="frameworks"/> that is nearest
        /// to the <paramref name="targetFramework"/>, according to NuGet's framework
        /// compatibility rules. <c>null</c> is returned of none of the frameworks
        /// are compatible.
        /// </summary>
        /// <remarks>This API is <a href="https://github.com/microsoft/vs-threading/blob/main/doc/cookbook_vs.md#how-do-i-effectively-verify-that-my-code-is-fully-free-threaded">free-threaded.</a></remarks>
        /// <param name="targetFramework">The target framework.</param>
        /// <param name="fallbackTargetFrameworks">
        /// Target frameworks to use if the provided <paramref name="targetFramework"/> is not compatible.
        /// These fallback frameworks are attempted in sequence after <paramref name="targetFramework"/>.
        /// </param>
        /// <param name="frameworks">The list of frameworks to choose from.</param>
        /// <exception cref="ArgumentException">If any of the arguments are <c>null</c>.</exception>
        /// <returns>The nearest framework.</returns>
        [Obsolete("This API does not support .NET 5 and higher target frameworks with platforms. Use IVsFrameworkCompatibility3 instead.")]
        FrameworkName GetNearest(
            FrameworkName targetFramework,
            IEnumerable<FrameworkName> fallbackTargetFrameworks,
            IEnumerable<FrameworkName> frameworks);
    }

IVsFrameworkCompatibility3-Schnittstelle

    /// <summary>
    /// Contains methods to discover frameworks and compatibility between frameworks.
    /// </summary>
    public interface IVsFrameworkCompatibility3
    {
        /// <summary>
        /// Selects the framework from <paramref name="frameworks"/> that is nearest
        /// to the <paramref name="targetFramework"/>, according to NuGet's framework
        /// compatibility rules. <c>null</c> is returned of none of the frameworks
        /// are compatible.
        /// </summary>
        /// <param name="targetFramework">The target framework.</param>
        /// <param name="frameworks">The list of frameworks to choose from.</param>
        /// <exception cref="ArgumentNullException">If any of the arguments are null.</exception>
        /// <exception cref="ArgumentException">If any of the frameworks cannot be parsed.</exception>
        /// <returns>The nearest framework.</returns>
        /// <remarks>This API is <a href="https://github.com/microsoft/vs-threading/blob/9f065f155525c4561257e02ad61e66e93e073886/doc/cookbook_vs.md#how-do-i-effectively-verify-that-my-code-is-fully-free-threaded">free-threaded</a>.</remarks>
        IVsNuGetFramework GetNearest(IVsNuGetFramework targetFramework, IEnumerable<IVsNuGetFramework> frameworks);

        /// <summary>
        /// Selects the framework from <paramref name="frameworks"/> that is nearest
        /// to the <paramref name="targetFramework"/>, according to NuGet's framework
        /// compatibility rules. <c>null</c> is returned of none of the frameworks
        /// are compatible.
        /// </summary>
        /// <param name="targetFramework">The target framework.</param>
        /// <param name="fallbackTargetFrameworks">
        /// Target frameworks to use if the provided <paramref name="targetFramework"/> is not compatible.
        /// These fallback frameworks are attempted in sequence after <paramref name="targetFramework"/>.
        /// </param>
        /// <param name="frameworks">The list of frameworks to choose from.</param>
        /// <exception cref="ArgumentNullException">If any of the arguments are null.</exception>
        /// <exception cref="ArgumentException">If any of the frameworkscannot be parsed.</exception>
        /// <returns>The nearest framework.</returns>
        /// <remarks>This API is <a href="https://github.com/microsoft/vs-threading/blob/9f065f155525c4561257e02ad61e66e93e073886/doc/cookbook_vs.md#how-do-i-effectively-verify-that-my-code-is-fully-free-threaded">free-threaded</a>.</remarks>
        IVsNuGetFramework GetNearest(
            IVsNuGetFramework targetFramework,
            IEnumerable<IVsNuGetFramework> fallbackTargetFrameworks,
            IEnumerable<IVsNuGetFramework> frameworks);
    }

IVsFrameworkParser-Schnittstelle

    /// <summary>
    /// An interface for dealing with the conversion between strings and <see cref="FrameworkName"/>
    /// instances.
    /// </summary>
    [Obsolete("This API does not support .NET 5 and higher target frameworks with platforms. Use IVsFrameworkParser2 instead.")]
    public interface IVsFrameworkParser
    {
        /// <summary>
        /// Parses a short framework name (e.g. "net45") or a full framework name
        /// (e.g. ".NETFramework,Version=v4.5") into a <see cref="FrameworkName"/>
        /// instance.
        /// </summary>
        /// <remarks>This API is <a href="https://github.com/microsoft/vs-threading/blob/main/doc/cookbook_vs.md#how-do-i-effectively-verify-that-my-code-is-fully-free-threaded">free-threaded.</a></remarks>
        /// <param name="shortOrFullName">The framework string.</param>
        /// <exception cref="ArgumentNullException">If the provided string is null.</exception>
        /// <exception cref="ArgumentException">If the provided string cannot be parsed.</exception>
        /// <returns>The parsed framework.</returns>
        [Obsolete("This API does not support .NET 5 and higher target frameworks with platforms. Use IVsFrameworkParser2 instead.")]
        FrameworkName ParseFrameworkName(string shortOrFullName);

        /// <summary>
        /// Gets the shortened version of the framework name from a <see cref="FrameworkName"/>
        /// instance.
        /// </summary>
        /// <remarks>
        /// For example, ".NETFramework,Version=v4.5" is converted to "net45". This is the value
        /// used inside of .nupkg folder structures as well as in project.json files.
        /// <para>This API is <a href="https://github.com/microsoft/vs-threading/blob/main/doc/cookbook_vs.md#how-do-i-effectively-verify-that-my-code-is-fully-free-threaded">free-threaded.</a></para>
        /// </remarks>
        /// <param name="frameworkName">The framework name.</param>
        /// <exception cref="ArgumentNullException">If the input is null.</exception>
        /// <exception cref="ArgumentException">
        /// If the provided framework name cannot be converted to a short name.
        /// </exception>
        /// <returns>The short framework name. </returns>
        [Obsolete("This API does not support .NET 5 and higher target frameworks with platforms. Use IVsFrameworkParser2 instead.")]
        string GetShortFrameworkName(FrameworkName frameworkName);
    }

IVsFrameworkParser2-Schnittstelle

    /// <summary>An interface to parse .NET Framework strings. See <a href="http://aka.ms/NuGet-IVsFrameworkParser">http://aka.ms/NuGet-IVsFrameworkParser</a>.</summary>
    public interface IVsFrameworkParser2
    {
        /// <summary>
        /// Parses a short framework name (e.g. "net45") or a full Target Framework Moniker
        /// (e.g. ".NETFramework,Version=v4.5") into a <see cref="IVsNuGetFramework"/>
        /// instance.
        /// </summary>
        /// <param name="input">The framework string</param>
        /// <param name="nuGetFramework">The resulting <see cref="IVsNuGetFramework"/>. If the method returns false, this return NuGet's "Unsupported" framework details.</param>
        /// <returns>A boolean to specify whether the input could be parsed into a valid <see cref="IVsNuGetFramework"/> object.</returns>
        /// <remarks>This API is not needed to get framework information about loaded projects, and should not be used to parse the project's TargetFramework property. See <a href="http://aka.ms/NuGet-IVsFrameworkParser">http://aka.ms/NuGet-IVsFrameworkParser</a>.<br/>
        /// This API is <a href="https://github.com/microsoft/vs-threading/blob/9f065f155525c4561257e02ad61e66e93e073886/doc/cookbook_vs.md#how-do-i-effectively-verify-that-my-code-is-fully-free-threaded">free-threaded</a>.</remarks>
        bool TryParse(string input, out IVsNuGetFramework nuGetFramework);
    }

IVsGlobalPackagesInitScriptExecutor-Schnittstelle

    /// <summary>
    /// Execute powershell scripts from package(s) in a solution
    /// </summary>
    /// <remarks>Intended for internal use only.</remarks>
    public interface IVsGlobalPackagesInitScriptExecutor
    {
        /// <summary>
        /// Executes the init script of the given package if available.
        /// 1) If the init.ps1 script has already been executed by the powershell host, it will not be executed again.
        /// True is returned.
        /// 2) If the package is found in the global packages folder it will be used.
        /// If not, it will return false and do nothing.
        /// 3) Also, note if other scripts are executing while this call was made, it will wait for them to complete.
        /// </summary>
        /// <param name="packageId">Id of the package whose init.ps1 will be executed.</param>
        /// <param name="packageVersion">Version of the package whose init.ps1 will be executed.</param>
        /// <returns>Returns true if the script was executed or has been executed already.</returns>
        /// <remarks>This method throws if the init.ps1 being executed throws.</remarks>
        Task<bool> ExecuteInitScriptAsync(string packageId, string packageVersion);
    }

IVsPackageInstaller-Schnittstelle

    /// <summary>
    /// Contains methods to install packages into a project within the current solution.
    /// </summary>
    [ComImport]
    [Guid("4F3B122B-A53B-432C-8D85-0FAFB8BE4FF4")]
    public interface IVsPackageInstaller
    {
        /// <summary>
        /// Installs a single package from the specified package source.
        /// </summary>
        /// <remarks>Can be called from a background thread, if the UI thread is not blocked waiting for this to finish.
        /// See <a href="https://github.com/nuget/home/issues/11476">https://github.com/nuget/home/issues/11476</a></remarks>
        /// <param name="source">
        /// The package source to install the package from. This value can be <c>null</c>
        /// to indicate that the user's configured sources should be used. Otherwise,
        /// this should be the source path as a string. If the user has credentials
        /// configured for a source, this value must exactly match the configured source
        /// value.
        /// </param>
        /// <param name="project">The target project for package installation.</param>
        /// <param name="packageId">The package ID of the package to install.</param>
        /// <param name="version">
        /// The version of the package to install. <c>null</c> can be provided to
        /// install the latest version of the package.
        /// </param>
        /// <param name="ignoreDependencies">
        /// A boolean indicating whether or not to ignore the package's dependencies
        /// during installation.
        /// </param>
        [Obsolete("System.Version does not support SemVer pre-release versions. Use the overload with string version instead.")]
        void InstallPackage(string source, Project project, string packageId, Version version, bool ignoreDependencies);

        /// <summary>
        /// Installs a single package from the specified package source.
        /// </summary>
        /// <remarks>Can be called from a background thread, if the UI thread is not blocked waiting for this to finish.
        /// See <a href="https://github.com/nuget/home/issues/11476">https://github.com/nuget/home/issues/11476</a></remarks>
        /// <param name="source">
        /// The package source to install the package from. This value can be <c>null</c>
        /// to indicate that the user's configured sources should be used. Otherwise,
        /// this should be the source path as a string. If the user has credentials
        /// configured for a source, this value must exactly match the configured source
        /// value.
        /// </param>
        /// <param name="project">The target project for package installation.</param>
        /// <param name="packageId">The package ID of the package to install.</param>
        /// <param name="version">
        /// The version of the package to install. <c>null</c> can be provided to
        /// install the latest version of the package.
        /// </param>
        /// <param name="ignoreDependencies">
        /// A boolean indicating whether or not to ignore the package's dependencies
        /// during installation.
        /// </param>
        void InstallPackage(string source, Project project, string packageId, string version, bool ignoreDependencies);

        /// <summary>
        /// Installs a single package from the specified package source.
        /// </summary>
        /// <param name="repository">The package repository to install the package from.</param>
        /// <param name="project">The target project for package installation.</param>
        /// <param name="packageId">The package id of the package to install.</param>
        /// <param name="version">
        /// The version of the package to install. <c>null</c> can be provided to
        /// install the latest version of the package.
        /// </param>
        /// <param name="ignoreDependencies">
        /// A boolean indicating whether or not to ignore the package's dependencies
        /// during installation.
        /// </param>
        /// <param name="skipAssemblyReferences">
        /// A boolean indicating if assembly references from the package should be
        /// skipped.
        /// </param>
        [Obsolete]
        void InstallPackage(IPackageRepository repository, Project project, string packageId, string version, bool ignoreDependencies, bool skipAssemblyReferences);

        /// <summary>
        /// Installs one or more packages that exist on disk in a folder defined in the registry.
        /// </summary>
        /// <param name="keyName">
        /// The registry key name (under NuGet's repository key) that defines the folder on disk
        /// containing the packages.
        /// </param>
        /// <param name="isPreUnzipped">
        /// A boolean indicating whether the folder contains packages that are
        /// pre-unzipped.
        /// </param>
        /// <param name="skipAssemblyReferences">
        /// A boolean indicating whether the assembly references from the packages
        /// should be skipped.
        /// </param>
        /// <param name="project">The target project for package installation.</param>
        /// <param name="packageVersions">
        /// A dictionary of packages/versions to install where the key is the package id
        /// and the value is the version.
        /// </param>
        /// <remarks>
        /// If any version of the package is already installed, no action will be taken.
        /// <para>
        /// Dependencies are always ignored.
        /// </para>
        /// <para>Can be called from a background thread, if the UI thread is not blocked waiting for this to finish.
        /// See <a href="https://github.com/nuget/home/issues/11476">https://github.com/nuget/home/issues/11476</a></para>
        /// </remarks>
        void InstallPackagesFromRegistryRepository(string keyName, bool isPreUnzipped, bool skipAssemblyReferences, Project project, IDictionary<string, string> packageVersions);

        /// <summary>
        /// Installs one or more packages that exist on disk in a folder defined in the registry.
        /// </summary>
        /// <param name="keyName">
        /// The registry key name (under NuGet's repository key) that defines the folder on disk
        /// containing the packages.
        /// </param>
        /// <param name="isPreUnzipped">
        /// A boolean indicating whether the folder contains packages that are
        /// pre-unzipped.
        /// </param>
        /// <param name="skipAssemblyReferences">
        /// A boolean indicating whether the assembly references from the packages
        /// should be skipped.
        /// </param>
        /// <param name="ignoreDependencies">A boolean indicating whether the package's dependencies should be ignored</param>
        /// <param name="project">The target project for package installation.</param>
        /// <param name="packageVersions">
        /// A dictionary of packages/versions to install where the key is the package id
        /// and the value is the version.
        /// </param>
        /// <remarks>
        /// If any version of the package is already installed, no action will be taken.
        /// <para>Can be called from a background thread, if the UI thread is not blocked waiting for this to finish.
        /// See <a href="https://github.com/nuget/home/issues/11476">https://github.com/nuget/home/issues/11476</a></para>
        /// </remarks>
        void InstallPackagesFromRegistryRepository(string keyName, bool isPreUnzipped, bool skipAssemblyReferences, bool ignoreDependencies, Project project, IDictionary<string, string> packageVersions);

        /// <summary>
        /// Installs one or more packages that are embedded in a Visual Studio Extension Package.
        /// </summary>
        /// <param name="extensionId">The Id of the Visual Studio Extension Package.</param>
        /// <param name="isPreUnzipped">
        /// A boolean indicating whether the folder contains packages that are
        /// pre-unzipped.
        /// </param>
        /// <param name="skipAssemblyReferences">
        /// A boolean indicating whether the assembly references from the packages
        /// should be skipped.
        /// </param>
        /// <param name="project">The target project for package installation</param>
        /// <param name="packageVersions">
        /// A dictionary of packages/versions to install where the key is the package id
        /// and the value is the version.
        /// </param>
        /// <remarks>
        /// If any version of the package is already installed, no action will be taken.
        /// <para>
        /// Dependencies are always ignored.
        /// </para>
        /// <para>Can be called from a background thread, if the UI thread is not blocked waiting for this to finish.
        /// See <a href="https://github.com/nuget/home/issues/11476">https://github.com/nuget/home/issues/11476</a></para>
        /// </remarks>
        void InstallPackagesFromVSExtensionRepository(string extensionId, bool isPreUnzipped, bool skipAssemblyReferences, Project project, IDictionary<string, string> packageVersions);

        /// <summary>
        /// Installs one or more packages that are embedded in a Visual Studio Extension Package.
        /// </summary>
        /// <param name="extensionId">The Id of the Visual Studio Extension Package.</param>
        /// <param name="isPreUnzipped">
        /// A boolean indicating whether the folder contains packages that are
        /// pre-unzipped.
        /// </param>
        /// <param name="skipAssemblyReferences">
        /// A boolean indicating whether the assembly references from the packages
        /// should be skipped.
        /// </param>
        /// <param name="ignoreDependencies">A boolean indicating whether the package's dependencies should be ignored</param>
        /// <param name="project">The target project for package installation</param>
        /// <param name="packageVersions">
        /// A dictionary of packages/versions to install where the key is the package id
        /// and the value is the version.
        /// </param>
        /// <remarks>
        /// If any version of the package is already installed, no action will be taken.
        /// <para>Can be called from a background thread, if the UI thread is not blocked waiting for this to finish.
        /// See <a href="https://github.com/nuget/home/issues/11476">https://github.com/nuget/home/issues/11476</a></para>
        /// </remarks>
        void InstallPackagesFromVSExtensionRepository(string extensionId, bool isPreUnzipped, bool skipAssemblyReferences, bool ignoreDependencies, Project project, IDictionary<string, string> packageVersions);
    }

IVsPackageinstaller2-Schnittstelle


    /// <summary>
    /// Contains method to install latest version of a single package into a project within the current solution.
    /// </summary>
    public interface IVsPackageInstaller2 : IVsPackageInstaller
    {
        /// <summary>
        /// Installs the latest version of a single package from the specified package source.
        /// </summary>
        /// <remarks>Can be called from a background thread, if the UI thread is not blocked waiting for this to finish.
        /// See <a href="https://github.com/nuget/home/issues/11476">https://github.com/nuget/home/issues/11476</a></remarks>
        /// <param name="source">
        /// The package source to install the package from. This value can be <c>null</c>
        /// to indicate that the user's configured sources should be used. Otherwise,
        /// this should be the source path as a string. If the user has credentials
        /// configured for a source, this value must exactly match the configured source
        /// value.
        /// </param>
        /// <param name="project">The target project for package installation.</param>
        /// <param name="packageId">The package ID of the package to install.</param>
        /// <param name="includePrerelease">
        /// Whether or not to consider prerelease versions when finding the latest version
        /// to install.
        /// </param>
        /// <param name="ignoreDependencies">
        /// A boolean indicating whether or not to ignore the package's dependencies
        /// during installation.
        /// </param>
        /// <exception cref="InvalidOperationException">
        /// Thrown when <see paramref="includePrerelease"/> is <c>false</c> and no stable version
        /// of the package exists.
        /// </exception>
        void InstallLatestPackage(
            string source,
            Project project,
            string packageId,
            bool includePrerelease,
            bool ignoreDependencies);
    }

IVsPackageInstallerEvents-Schnittstelle

Hinweis

Diese Ereignisse werden nur für packages.config-Projekte ausgelöst. Verwenden Sie stattdessen IVsNuGetProjectUpdateEvents um Updates für packages.config und PackageReference zu erhalten.

    /// <summary>
    /// Contains events which are raised when packages are installed or uninstalled from projects and the current
    /// solution.
    /// </summary>
    public interface IVsPackageInstallerEvents
    {
        /// <summary>
        /// Raised when a package is about to be installed into the current solution.
        /// </summary>
        event VsPackageEventHandler PackageInstalling;

        /// <summary>
        /// Raised after a package has been installed into the current solution.
        /// </summary>
        event VsPackageEventHandler PackageInstalled;

        /// <summary>
        /// Raised when a package is about to be uninstalled from the current solution.
        /// </summary>
        event VsPackageEventHandler PackageUninstalling;

        /// <summary>
        /// Raised after a package has been uninstalled from the current solution.
        /// </summary>
        event VsPackageEventHandler PackageUninstalled;

        /// <summary>
        /// Raised after a package has been installed into a project within the current solution.
        /// </summary>
        event VsPackageEventHandler PackageReferenceAdded;

        /// <summary>
        /// Raised after a package has been uninstalled from a project within the current solution.
        /// </summary>
        event VsPackageEventHandler PackageReferenceRemoved;
    }

IVsPackageInstallerProjectEvents-Schnittstelle

Hinweis

Diese Ereignisse werden nur für packages.config-Projekte ausgelöst. Verwenden Sie stattdessen IVsNuGetProjectUpdateEvents um Updates für packages.config und PackageReference zu erhalten.

    /// <summary>
    /// Contains batch events which are raised when packages are installed or uninstalled from projects with packages.config
    /// and the current solution.
    /// </summary>
    public interface IVsPackageInstallerProjectEvents
    {
        /// <summary>
        /// Raised before any IVsPackageInstallerEvents events are raised for a project.
        /// </summary>
        event VsPackageProjectEventHandler BatchStart;

        /// <summary>
        /// Raised after all IVsPackageInstallerEvents events are raised for a project.
        /// </summary>
        event VsPackageProjectEventHandler BatchEnd;

    }

IVsPackageInstallerServices-Schnittstelle

    /// <summary>
    /// Contains methods to query for installed packages within the current solution.
    /// </summary>
    [Obsolete("Use INuGetProjectService in the NuGet.VisualStudio.Contracts package instead.")]
    public interface IVsPackageInstallerServices
    {
        /// <summary>
        /// Get the list of NuGet packages installed in the current solution.
        /// </summary>
        [Obsolete("This method can cause UI delays if called on the UI thread. Use INuGetProjectService.GetInstalledPackagesAsync in the NuGet.VisualStudio.Contracts package instead, and iterate all projects in the solution")]
        IEnumerable<IVsPackageMetadata> GetInstalledPackages();

        /// <summary>
        /// Checks if a NuGet package with the specified Id is installed in the specified project.
        /// </summary>
        /// <param name="project">The project to check for NuGet package.</param>
        /// <param name="id">The id of the package to check.</param>
        /// <returns><c>true</c> if the package is install. <c>false</c> otherwise.</returns>
        /// <exception cref="InvalidOperationException">A "project not nominated" exception will be thrown if the project system has not yet told NuGet about the project.
        /// You can use <see cref="IVsNuGetProjectUpdateEvents"/> or Microsoft.VisualStudio.OperationProgress to be notified when the project is ready.</exception>
        [Obsolete("This method can cause UI delays if called on the UI thread. Use INuGetProjectService.GetInstalledPackagesAsync in the NuGet.VisualStudio.Contracts package instead, and check the specific package you're interested in")]
        bool IsPackageInstalled(Project project, string id);

        /// <summary>
        /// Checks if a NuGet package with the specified Id and version is installed in the specified project.
        /// </summary>
        /// <param name="project">The project to check for NuGet package.</param>
        /// <param name="id">The id of the package to check.</param>
        /// <param name="version">The version of the package to check.</param>
        /// <returns><c>true</c> if the package is install. <c>false</c> otherwise.</returns>
        /// <exception cref="InvalidOperationException">A "project not nominated" exception will be thrown if the project system has not yet told NuGet about the project.
        /// You can use <see cref="IVsNuGetProjectUpdateEvents"/> or Microsoft.VisualStudio.OperationProgress to be notified when the project is ready.</exception>
        [Obsolete("This method can cause UI delays if called on the UI thread. Use INuGetProjectService.GetInstalledPackagesAsync in the NuGet.VisualStudio.Contracts package instead, and check the specific package you're interested in")]
        bool IsPackageInstalled(Project project, string id, SemanticVersion version);

        /// <summary>
        /// Checks if a NuGet package with the specified Id and version is installed in the specified project.
        /// </summary>
        /// <param name="project">The project to check for NuGet package.</param>
        /// <param name="id">The id of the package to check.</param>
        /// <param name="versionString">The version of the package to check.</param>
        /// <returns><c>true</c> if the package is install. <c>false</c> otherwise.</returns>
        /// <remarks>
        /// The reason this method is named IsPackageInstalledEx, instead of IsPackageInstalled, is that
        /// when client project compiles against this assembly, the compiler would attempt to bind against
        /// the other overload which accepts SemanticVersion and would require client project to reference NuGet.Core.
        /// </remarks>
        /// <exception cref="InvalidOperationException">A "project not nominated" exception will be thrown if the project system has not yet told NuGet about the project.
        /// You can use <see cref="IVsNuGetProjectUpdateEvents"/> or Microsoft.VisualStudio.OperationProgress to be notified when the project is ready.</exception>
        [Obsolete("This method can cause UI delays if called on the UI thread. Use INuGetProjectService.GetInstalledPackagesAsync in the NuGet.VisualStudio.Contracts package instead, and check the specific package you're interested in")]
        bool IsPackageInstalledEx(Project project, string id, string versionString);

        /// <summary>
        /// Get the list of NuGet packages installed in the specified project.
        /// </summary>
        /// <param name="project">The project to get NuGet packages from.</param>
        /// <exception cref="InvalidOperationException">A "project not nominated" exception will be thrown if the project system has not yet told NuGet about the project.
        /// You can use <see cref="IVsNuGetProjectUpdateEvents"/> or Microsoft.VisualStudio.OperationProgress to be notified when the project is ready.</exception>
        [Obsolete("This method can cause UI delays if called on the UI thread. Use INuGetProjectService.GetInstalledPackagesAsync in the NuGet.VisualStudio.Contracts package instead")]
        IEnumerable<IVsPackageMetadata> GetInstalledPackages(Project project);
    }

IVsPackageManagerProvider-Schnittstelle

Diese Schnittstelle wurde hauptsächlich vom ASP.NET-Team verwendet, um vorzuschlagen, dass Javascript- und CSS-Pakete, wie jQuery und bootstrap mit Bower anstelle von NuGet installiert werden. Da sie diese Funktionalität aus Visual Studio entfernt haben, hat NuGet diese Schnittstelle veraltet und wird nicht mehr von der Paket-Manager-Benutzeroberfläche in Visual Studio 2022 (Version 17.0) und höher verwendet.

    /// <summary>
    /// Interface allowing integration of alternate package manager suggestion for a NuGet package. 
    /// For example jQuery may appear on Bower and npm,
    /// it might be more appropriate to install a package from them for certain projects. 
    /// </summary>
    [Obsolete]
    public interface IVsPackageManagerProvider
    {
        /// <summary>
        /// Localized display package manager name.
        /// </summary>
        string PackageManagerName { get; }

        /// <summary>
        /// Package manager unique id.
        /// </summary>
        string PackageManagerId { get; }

        /// <summary>
        /// The tool tip description for the package
        /// </summary>
        string Description { get; }

        /// <summary>
        /// Check if a recommendation should be surfaced for an alternate package manager. 
        /// This code should not rely on slow network calls, and should return rapidly.
        /// </summary>
        /// <param name="packageId">Current package id</param>
        /// <param name="projectName">Unique project name for finding the project through VS dte</param>
        /// <param name="token">Cancellation Token</param>
        /// <returns>return true if need to direct to integrated package manager for this package</returns>
        Task<bool> CheckForPackageAsync(string packageId, string projectName, CancellationToken token);

        /// <summary>
        /// This Action should take the user to the other package manager.
        /// </summary>
        /// <param name="packageId">Current package id</param>
        /// <param name="projectName">Unique project name for finding the project through VS dte</param>
        void GoToPackage(string packageId, string projectName);
    }

IVsPackageRestorer-Schnittstelle


    /// <summary>
    /// Contains methods to restore packages installed in a project within the current solution.
    /// </summary>
    public interface IVsPackageRestorer
    {
        /// <summary>
        /// Returns a value indicating whether the user consent to download NuGet packages
        /// has been granted.
        /// </summary>
        /// <remarks>Can be called from a background thread.</remarks>
        /// <returns>true if the user consent has been granted; otherwise, false.</returns>
        bool IsUserConsentGranted();

        /// <summary>
        /// Restores NuGet packages installed in the given project within the current solution.
        /// </summary>
        /// <remarks>Can be called from a background thread.</remarks>
        /// <param name="project">The project whose NuGet packages to restore.</param>
        void RestorePackages(Project project);
    }

IVsPackageSourceProvider-Schnittstelle

    /// <summary>
    /// A public API for retrieving the list of NuGet package sources.
    /// </summary>
    public interface IVsPackageSourceProvider
    {
        /// <summary>
        /// Provides the list of package sources.
        /// </summary>
        /// <remarks>Can be called from a background thread.</remarks>
        /// <param name="includeUnOfficial">Unofficial sources will be included in the results</param>
        /// <param name="includeDisabled">Disabled sources will be included in the results</param>
        /// <remarks>Does not require the UI thread.</remarks>
        /// <exception cref="ArgumentException">Thrown if a NuGet configuration file is invalid.</exception>
        /// <exception cref="ArgumentNullException">Thrown if a NuGet configuration file is invalid.</exception>
        /// <exception cref="InvalidOperationException">Thrown if a NuGet configuration file is invalid.</exception>
        /// <exception cref="InvalidDataException">Thrown if a NuGet configuration file is invalid.</exception>
        /// <returns>Key: source name Value: source URI</returns>
        IEnumerable<KeyValuePair<string, string>> GetSources(bool includeUnOfficial, bool includeDisabled);

        /// <summary>
        /// Raised when sources are added, removed, disabled, or modified.
        /// </summary>
        event EventHandler SourcesChanged;
    }

IVsPackageUninstaller-Schnittstelle

    /// <summary>
    /// Contains methods to uninstall packages from a project within the current solution.
    /// </summary>
    public interface IVsPackageUninstaller
    {
        /// <summary>
        /// Uninstall the specified package from a project and specify whether to uninstall its dependency packages
        /// too.
        /// </summary>
        /// <remarks>Can be called from a background thread, if the UI thread is not blocked waiting for this to finish.
        /// See <a href="https://github.com/nuget/home/issues/11476">https://github.com/nuget/home/issues/11476</a></remarks>
        /// <param name="project">The project from which the package is uninstalled.</param>
        /// <param name="packageId">The package to be uninstalled</param>
        /// <param name="removeDependencies">
        /// A boolean to indicate whether the dependency packages should be
        /// uninstalled too.
        /// </param>
        void UninstallPackage(Project project, string packageId, bool removeDependencies);
    }

IVsPathContext-Schnittstelle

    /// <summary>
    /// NuGet path information specific to the current context (e.g. project context).
    /// Represents captured snapshot associated with current project/solution settings.
    /// Should be discarded immediately after all queries are done.
    /// </summary>
    public interface IVsPathContext
    {
        /// <summary>
        /// User package folder directory. The path returned is an absolute path.
        /// </summary>
        string UserPackageFolder { get; }

        /// <summary>
        /// Fallback package folder locations. The paths (if any) in the returned list are absolute paths. If no
        /// fallback package folders are configured, an empty list is returned. The item type of this sequence is
        /// <see cref="string"/>.
        /// </summary>
        /// <remarks>Can be called from a background thread.</remarks>
        IEnumerable FallbackPackageFolders { get; }

        /// <summary>
        /// Fetch a package directory containing the provided asset path.
        /// </summary>
        /// <param name="packageAssetPath">Absolute path to package asset file.</param>
        /// <param name="packageDirectoryPath">Full path to a package directory. 
        /// <code>null</code> if returned falue is <code>false</code>.</param>
        /// <returns>
        /// <code>true</code> when a package containing the given file was found, <code>false</code> - otherwise.
        /// </returns>
        /// <example>
        /// Suppose the project is a packages.config project and the following asset paths are provided:
        /// 
        /// - C:\src\MyProject\packages\NuGet.Versioning.3.5.0-rc1-final\lib\net45\NuGet.Versioning.dll
        /// - C:\path\to\non\package\assembly\Newtonsoft.Json.dll
        /// - C:\src\MyOtherProject\packages\NuGet.Core.2.12.0\lib\net40\NuGet.Core.dll
        /// - C:\src\MyProject\packages\Autofac.3.5.2\lib\net40\Autofac.dll
        /// - C:\src\MyProject\packages\Autofac.3.5.2\lib\net40\Autofac.Fake.dll
        /// 
        /// The result will be:
        /// 
        /// - C:\src\MyProject\packages\NuGet.Versioning.3.5.0-rc1-final
        /// - null
        /// - null
        /// - C:\src\MyProject\packages\Autofac.3.5.2
        /// - C:\src\MyProject\packages\Autofac.3.5.2
        /// </example>
        bool TryResolvePackageAsset(string packageAssetPath, out string packageDirectoryPath);
    }

IVsPathContext2-Schnittstelle

    /// <summary>
    /// NuGet path information specific to the current context (e.g. project context) or solution context
    /// Represents captured snapshot associated with current project/solution settings.
    /// Should be discarded immediately after all queries are done.
    /// </summary>
    public interface IVsPathContext2 : IVsPathContext
    {
        /// <summary>
        /// Solution packages folder directory. This will always be set irrespective if folder actually exists or not.
        /// The path returned is an absolute path.
        /// </summary>
        string SolutionPackageFolder { get; }
    }

IVsPathContextProvider-Schnittstelle

    /// <summary>
    /// A factory to initialize <see cref="IVsPathContext"/> instances.
    /// </summary>
    public interface IVsPathContextProvider
    {
        /// <summary>
        /// Attempts to create an instance of <see cref="IVsPathContext"/>.
        /// </summary>
        /// <remarks>Can be called from a background thread.</remarks>
        /// <param name="projectUniqueName">
        /// Unique identificator of the project. Should be a full path to project file.
        /// </param>
        /// <param name="context">The path context associated with given project.</param>
        /// <returns>
        /// <code>True</code> if operation has succeeded and context was created.
        /// False, otherwise, e.g. when provided project is not managed by NuGet.
        /// </returns>
        /// <throws>
        /// <code>ArgumentNullException</code> if projectUniqueName is passed as null.
        /// <code>InvalidOperationException</code> when it fails to create a context and return appropriate error message.
        /// </throws>
        bool TryCreateContext(string projectUniqueName, out IVsPathContext context);
    }

IVsPathContextProvider2-Schnittstelle

    /// <summary>
    /// A factory to initialize <see cref="IVsPathContext2"/> instances.
    /// </summary>
    public interface IVsPathContextProvider2 : IVsPathContextProvider
    {
        /// <summary>
        /// Attempts to create an instance of <see cref="IVsPathContext2"/> for the solution.
        /// </summary>
        /// <remarks>This API is free-threaded, but APIs on the returned IVsPathContext2 may not be.</remarks>
        /// <param name="context">The path context associated with this solution.</param>
        /// <returns>
        /// <code>True</code> if operation has succeeded and context was created.
        /// <code>False</code> otherwise.
        /// </returns>
        /// <throws>
        /// <code>InvalidOperationException</code> when it fails to create a context and return appropriate error message.
        /// </throws>
        bool TryCreateSolutionContext(out IVsPathContext2 context);

        /// <summary>
        /// Attempts to create an instance of <see cref="IVsPathContext2"/> for the solution.
        /// </summary>
        /// <remarks>This API is free-threaded, but APIs on the returned IVsPathContext2 may not be.</remarks>
        /// <param name="solutionDirectory">
        /// path to the solution directory. Must be an absolute path.
        /// It will be performant to pass the solution directory if it's available.
        /// </param>
        /// <param name="context">The path context associated with this solution.</param>
        /// <returns>
        /// <code>True</code> if operation has succeeded and context was created.
        /// <code>False</code> otherwise.
        /// </returns>
        /// <throws>
        /// <code>ArgumentNullException</code> if solutionDirectory is passed as null.
        /// <code>InvalidOperationException</code> when it fails to create a context and return appropriate error message.
        /// </throws>
        bool TryCreateSolutionContext(string solutionDirectory, out IVsPathContext2 context);

        /// <summary>
        /// Attempts to create an instance of <see cref="IVsPathContext"/> containing only the user wide and machine wide configurations.
        /// If a solution is loaded, note that the values in the path context might not be the actual effective values for the solution.
        /// If a customer has overriden the `globalPackagesFolder` key or cleared the `fallbackPackageFolders`, these values will be incorrect.
        /// It is important to keep this scenario in mind when working with this path. To predict differences you can call this in combination with <see cref="TryCreateSolutionContext(out IVsPathContext2)"/>.
        /// </summary>
        /// <returns>
        /// <code>True</code> if operation has succeeded and context was created.
        /// <code>False</code> otherwise.
        /// </returns>
        /// <remarks>
        /// This method can be safely invoked from a background thread. Do note that this method might switch to the UI thread internally, so be mindful of blocking the UI thread on this.
        /// </remarks>
        bool TryCreateNoSolutionContext(out IVsPathContext vsPathContext);
    }

IVsProjectJsonToPackageReferenceMigrator-Schnittstelle

    /// <summary>
    /// Contains methods to migrate a project.json based legacy project to PackageReference based project.
    /// </summary>
    public interface IVsProjectJsonToPackageReferenceMigrator
    {
        /// <summary>
        /// Migrates a legacy Project.json based project to Package Reference based project. The result 
        /// should be casted to type <see cref="IVsProjectJsonToPackageReferenceMigrateResult"/>
        /// The backup of the original project file and project.json file is created in the Backup folder
        /// in the root of the project directory.
        /// </summary>
        /// <param name="projectUniqueName">The full path to the project that needs to be migrated</param>
        Task<object> MigrateProjectJsonToPackageReferenceAsync(string projectUniqueName);

    }

IVsSemanticVersionComparer-Schnittstelle

    /// <summary>
    /// An interface for comparing two opaque version strings by treating them as NuGet semantic
    /// versions.
    /// </summary>
    public interface IVsSemanticVersionComparer
    {
        /// <summary>
        /// Compares two version strings as if they were NuGet semantic version
        /// strings. Returns a number less than zero if <paramref name="versionA"/>
        /// is less than <paramref name="versionB"/>. Returns zero if the two versions 
        /// are equivalent. Returns a number greater than zero if <paramref name="versionA"/>
        /// is greater than <paramref name="versionB"/>.
        /// </summary>
        /// <remarks>This API is free-threaded.</remarks>
        /// <param name="versionA">The first version string.</param>
        /// <param name="versionB">The second version string.</param>
        /// <exception cref="ArgumentNullException">If either version string is null.</exception>
        /// <exception cref="ArgumentException">If either string cannot be parsed.</exception>
        /// <returns>
        /// A standard comparison integer based on the relationship between the
        /// two provided versions.
        /// </returns>
        int Compare(string versionA, string versionB);
    }

IVsNuGetProjectUpdateEvents-Schnittstelle

    /// <summary>
    /// NuGet project update events.
    /// This API provides means of tracking project updates by NuGet.
    /// In particular, for PackageReference projects, updates to the assets file and nuget generated props/targets.
    /// For packages.config projects, package installations will be tracked.
    /// All events are fired from a threadpool thread.
    /// </summary>
    public interface IVsNuGetProjectUpdateEvents
    {
        /// <summary>
        /// Raised when solution restore starts with the list of projects that will be restored.
        /// The list will not include all projects. Some projects may have been skipped in earlier up to date check, and other projects may no-op.
        /// </summary>
        /// <remarks>
        /// Just because a project is being restored that doesn't necessarily mean any actual updates will happen.
        /// No heavy computation should happen in any of these methods as it'll block the NuGet progress.
        /// </remarks>
        event SolutionRestoreEventHandler SolutionRestoreStarted;

        /// <summary>
        /// Raised when solution restore finishes with the list of projects that were restored.
        /// The list will not include all projects. Some projects may have been skipped in earlier up to date check, and other projects may no-op.
        /// </summary>
        /// <remarks>
        /// Just because a project is being restored that doesn't necessarily mean any actual updates will happen.
        /// No heavy computation should happen in any of these methods as it'll block the NuGet progress.
        /// </remarks>
        event SolutionRestoreEventHandler SolutionRestoreFinished;

        /// <summary>
        /// Raised when particular project is about to be updated.
        /// For PackageReference projects, this means an assets file or a nuget temp msbuild file write (nuget.g.props or nuget.g.targets). The list of updated files will include the aforementioned.
        /// If a project was restored, but no file updates happen, this event will not be fired.
        /// For packages.config projects, this means that the project file was changed.
        /// </summary>
        /// <remarks>
        /// No heavy computation should happen in any of these methods as it'll block the NuGet progress.
        /// </remarks>
        event ProjectUpdateEventHandler ProjectUpdateStarted;

        /// <summary>
        /// Raised when particular project update has been completed.
        /// For PackageReference projects, this means an assets file or a nuget temp msbuild file write (nuget.g.props or nuget.g.targets). The list of updated files will include the aforementioned.
        /// If a project was restored, but no file updates happen, this event will not be fired.
        /// For packages.config projects, this means that the project file was changed.
        /// </summary>
        /// <remarks>
        /// No heavy computation should happen in any of these methods as it'll block the NuGet progress.
        /// </remarks>
        event ProjectUpdateEventHandler ProjectUpdateFinished;
    }

    /// <summary>
    /// Defines an event handler delegate for solution restore start and end.
    /// </summary>
    /// <param name="projects">List of projects that will run restore. Never <see langword="null"/>.</param>
    public delegate void SolutionRestoreEventHandler(IReadOnlyList<string> projects);

    /// <summary>
    /// Defines an event handler delegate for project updates.
    /// </summary>
    /// <param name="projectUniqueName">Project full path. Never <see langword="null"/>. </param>
    /// <param name="updatedFiles">NuGet output files that may be updated. Never <see langword="null"/>.</param>
    public delegate void ProjectUpdateEventHandler(string projectUniqueName, IReadOnlyList<string> updatedFiles);
}

IVsSolutionRestoreService-Schnittstelle

    /// <summary>
    /// Represents a package restore service API for integration with a project system.
    /// </summary>
    public interface IVsSolutionRestoreService
    {
        /// <summary>
        /// A task providing last/current restore operation status.
        /// Could be null if restore has not started yet.
        /// </summary>
        /// <remarks>
        /// This task is a reflection of the current state of the current-restore-operation or
        /// recently-completed-restore. The usage of this property will be to continue,
        /// e.g. to build solution or something) on completion of this task.
        /// Also, on completion, if the task returns false then it means the restore failed and
        /// the build task will be terminated.
        /// </remarks>
        Task<bool> CurrentRestoreOperation { get; }

        /// <summary>
        /// An entry point used by CPS to indicate given project needs to be restored.
        /// </summary>
        /// <param name="projectUniqueName">
        /// Unique identifier of the project. Should be a full path to project file.
        /// </param>
        /// <param name="projectRestoreInfo">Metadata <see cref="IVsProjectRestoreInfo"/> needed for restoring the project.</param>
        /// <param name="token">Cancellation token.</param>
        /// <returns>
        /// Returns a restore task corresponding to the nominated project request.
        /// NuGet will batch restore requests so it's possible the same restore task will be returned for multiple projects.
        /// When the requested restore operation for the given project completes the task will indicate operation success or failure.
        /// </returns>
        /// <exception cref="ArgumentException">Thrown if <paramref name="projectUniqueName" /> is not the path of a project file.</exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="projectRestoreInfo" /> is <c>null</c>.</exception>
        /// <exception cref="OperationCanceledException">Thrown if <paramref name="token" /> is cancelled.</exception>
        Task<bool> NominateProjectAsync(string projectUniqueName, IVsProjectRestoreInfo projectRestoreInfo, CancellationToken token);
    }

IVsSolutionRestoreService2-Schnittstelle

    /// <summary>
    /// Represents a package restore service API for integration with a project system.
    /// </summary>
    public interface IVsSolutionRestoreService2
    {
        /// <summary>
        /// An entry point which allows non-NETCore SDK based projects to indicate given project needs to be restored.
        /// </summary>
        /// <param name="projectUniqueName">
        /// Unique identificator of the project. Should be a full path to project file.
        /// </param>
        /// <param name="token">Cancellation token.</param>
        /// <returns>
        /// Returns a restore task corresponding to the nominated project request.
        /// NuGet will batch restore requests so it's possible the same restore task will be returned for multiple projects.
        /// When the requested restore operation for the given project completes the task will indicate operation success or failure.
        /// </returns>
        Task<bool> NominateProjectAsync(string projectUniqueName, CancellationToken token);
    }

IVsSolutionRestoreService3-Schnittstelle

    /// <summary>
    /// Represents a package restore service API for integration with a project system.
    /// </summary>
    public interface IVsSolutionRestoreService3
    {
        /// <summary>
        /// A task providing last/current restore operation status.
        /// Could be null if restore has not started yet.
        /// </summary>
        /// <remarks>
        /// This task is a reflection of the current state of the current-restore-operation or
        /// recently-completed-restore. The usage of this property will be to continue,
        /// e.g. to build solution or something) on completion of this task.
        /// Also, on completion, if the task returns false then it means the restore failed and
        /// the build task will be terminated.
        /// </remarks>
        Task<bool> CurrentRestoreOperation { get; }

        /// <summary>
        /// An entry point used by CPS to indicate given project needs to be restored.
        /// This entry point also handles PackageDownload items
        /// </summary>
        /// <param name="projectUniqueName">
        /// Unique identifier of the project. Should be a full path to project file.
        /// </param>
        /// <param name="projectRestoreInfo">Metadata <see cref="IVsProjectRestoreInfo2"/> needed for restoring the project.</param>
        /// <param name="token">Cancellation token.</param>
        /// <returns>
        /// Returns a restore task corresponding to the nominated project request.
        /// NuGet will batch restore requests so it's possible the same restore task will be returned for multiple projects.
        /// When the requested restore operation for the given project completes the task will indicate operation success or failure.
        /// </returns>
        /// <exception cref="ArgumentException">Thrown if <paramref name="projectUniqueName" /> is not the path of a project file.</exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="projectRestoreInfo" /> is <c>null</c>.</exception>
        /// <exception cref="OperationCanceledException">Thrown if <paramref name="token" /> is cancelled.</exception>
        Task<bool> NominateProjectAsync(string projectUniqueName, IVsProjectRestoreInfo2 projectRestoreInfo, CancellationToken token);
    }

IVsSolutionRestoreService4-Schnittstelle

    /// <summary>
    /// Represents a package restore service API for integration with a project system.
    /// Implemented by NuGet.
    /// </summary>
    public interface IVsSolutionRestoreService4 : IVsSolutionRestoreService3
    {
        /// <summary>
        /// A project system can call this service (optionally) to register itself to coordinate restore. <br/>
        /// Each project can only register once. NuGet will call into the source to wait for nominations for restore. <br/>
        /// NuGet will remove the registered object when a project is unloaded.
        /// </summary>
        /// <param name="restoreInfoSource">Represents a project specific info source</param>
        /// <param name="cancellationToken">Cancellation token.</param>
        /// <exception cref="InvalidOperationException">If the project has already been registered.</exception>
        /// <exception cref="ArgumentNullException">If <paramref name="restoreInfoSource"/> is null. </exception>
        /// <exception cref="ArgumentException">If <paramref name="restoreInfoSource"/>'s <see cref="IVsProjectRestoreInfoSource.Name"/> is <see langword="null"/>. </exception>
        Task RegisterRestoreInfoSourceAsync(IVsProjectRestoreInfoSource restoreInfoSource, CancellationToken cancellationToken);
    }

IVsProjectRestoreInfoSource-Schnittstelle

    /// <summary>
    /// Represents a package restore service API for integration with a project system.
    /// Implemented by the project-system.
    /// </summary>
    public interface IVsProjectRestoreInfoSource
    {
        /// <summary>
        /// Project Unique Name.
        /// Must be equivalent to the name provided in the <see cref="IVsSolutionRestoreService3.NominateProjectAsync(string, IVsProjectRestoreInfo2, CancellationToken)"/> or equivalent.
        /// </summary>
        /// <remarks>Never <see langword="null"/>.</remarks>
        string Name { get; }

        /// <summary>
        /// Whether the source needs to do some work that could lead to a nomination. <br/>
        /// Called frequently, so it should be very efficient.
        /// </summary>
        bool HasPendingNomination { get; }

        /// <summary>
        /// NuGet calls this method to wait on a potential nomination. <br/>
        /// If the project has no pending restore data, it will return a completed task. <br/>
        /// Otherwise, the task will be completed once the project nominates. <br/>
        /// The task will be cancelled, if the source decide it no longer needs to nominate (for example: the restore state has no change) <br/>
        /// The task will be failed, if the source runs into a problem, and it cannot get the correct data to nominate (for example: DT build failed) <br/>
        /// </summary>
        /// <param name="cancellationToken">Cancellation token.</param>
        Task WhenNominated(CancellationToken cancellationToken);
    }

IVsSolutionRestoreStatusProvider-Schnittstelle

    /// <summary>
    /// Provides the status of IVsSolutionRestore.
    /// </summary>
    public interface IVsSolutionRestoreStatusProvider
    {
        /// <summary>
        /// IsRestoreCompleteAsync indicates whether or not automatic package restore has pending work.
        /// Automatic package restore applies for both packages.config and PackageReference projects.
        ///
        /// Returns true if all projects in the solution that require nomination have been nominated for restore and all pending restores have completed.
        /// The result does not indicate that restore completed successfully, a failed restore will still return true.
        /// </summary>
        /// <remarks>
        /// Special cases:
        /// * An empty solution will return true.
        /// * If no solution is open this will true.
        /// * An invalid project that does not provide restore details will cause this to return false since restore will not run for that project.
        ///
        /// Restores running due to Install/Update/Uninstall operations are NOT included in this status. Status here is limited to IVsSolutionRestoreService.
        /// </remarks>
        Task<bool> IsRestoreCompleteAsync(CancellationToken token);
    }