Skip to main content

Overview

The PackageManager class is the primary entry point for the Windows Package Manager COM API. It provides methods for:
  • Installing, upgrading, uninstalling, and repairing packages
  • Searching for packages across catalogs
  • Managing package catalogs (sources)
  • Tracking installation progress
  • Downloading packages without installation

Class Definition

runtimeclass PackageManager
{
    PackageManager();
    
    // Catalog management
    IVectorView<PackageCatalogReference> GetPackageCatalogs();
    PackageCatalogReference GetPredefinedPackageCatalog(PredefinedPackageCatalog catalog);
    PackageCatalogReference GetLocalPackageCatalog(LocalPackageCatalog catalog);
    PackageCatalogReference GetPackageCatalogByName(String catalogName);
    PackageCatalogReference CreateCompositePackageCatalog(CreateCompositePackageCatalogOptions options);
    
    IAsyncOperationWithProgress<AddPackageCatalogResult, Double> 
        AddPackageCatalogAsync(AddPackageCatalogOptions options);
    IAsyncOperationWithProgress<RemovePackageCatalogResult, Double> 
        RemovePackageCatalogAsync(RemovePackageCatalogOptions options);
    EditPackageCatalogResult EditPackageCatalog(EditPackageCatalogOptions options);
    
    // Package operations
    IAsyncOperationWithProgress<InstallResult, InstallProgress> 
        InstallPackageAsync(CatalogPackage package, InstallOptions options);
    IAsyncOperationWithProgress<InstallResult, InstallProgress> 
        UpgradePackageAsync(CatalogPackage package, InstallOptions options);
    IAsyncOperationWithProgress<UninstallResult, UninstallProgress> 
        UninstallPackageAsync(CatalogPackage package, UninstallOptions options);
    IAsyncOperationWithProgress<RepairResult, RepairProgress> 
        RepairPackageAsync(CatalogPackage package, RepairOptions options);
    IAsyncOperationWithProgress<DownloadResult, PackageDownloadProgress> 
        DownloadPackageAsync(CatalogPackage package, DownloadOptions options);
    
    // Progress tracking
    IAsyncOperationWithProgress<InstallResult, InstallProgress> 
        GetInstallProgress(CatalogPackage package, PackageCatalogInfo catalogInfo);
    IAsyncOperationWithProgress<UninstallResult, UninstallProgress> 
        GetUninstallProgress(CatalogPackage package, PackageCatalogInfo catalogInfo);
    IAsyncOperationWithProgress<DownloadResult, PackageDownloadProgress> 
        GetDownloadProgress(CatalogPackage package, PackageCatalogInfo catalogInfo);
    
    // Version info
    String Version { get; };
}

Constructor

PackageManager()

Creates a new instance of the PackageManager.
var manager = new PackageManager();

Catalog Methods

GetPackageCatalogs()

Retrieves all available package catalogs (sources).
Returns
IVectorView<PackageCatalogReference>
A collection of package catalog references
var manager = new PackageManager();
var catalogs = manager.GetPackageCatalogs();

foreach (var catalogRef in catalogs)
{
    if (!catalogRef.IsComposite)
    {
        var info = catalogRef.Info;
        Console.WriteLine($"{info.Name}: {info.Type}");
        Console.WriteLine($"  Last Updated: {info.LastUpdateTime}");
        Console.WriteLine($"  Origin: {info.Origin}");
    }
}

GetPredefinedPackageCatalog()

Gets a reference to a predefined catalog.
predefinedPackageCatalog
PredefinedPackageCatalog
required
The predefined catalog to retrieve
Returns
PackageCatalogReference
Reference to the predefined catalog
PredefinedPackageCatalog enum values:
  • OpenWindowsCatalog - The official WinGet community repository
  • MicrosoftStore - Microsoft Store catalog
  • DesktopFrameworks - Desktop framework packages
  • OpenWindowsCatalogFont - Font packages catalog
var manager = new PackageManager();
var catalogRef = manager.GetPredefinedPackageCatalog(
    PredefinedPackageCatalog.OpenWindowsCatalog
);

var connectResult = await catalogRef.ConnectAsync();
if (connectResult.Status == ConnectResultStatus.Ok)
{
    var catalog = connectResult.PackageCatalog;
    // Use catalog for searches
}

GetLocalPackageCatalog()

Gets a reference to a local package catalog.
localPackageCatalog
LocalPackageCatalog
required
The local catalog to retrieve
LocalPackageCatalog enum values:
  • InstalledPackages - Catalog of installed packages
  • InstallingPackages - Catalog of packages currently being installed
var manager = new PackageManager();
var catalogRef = manager.GetLocalPackageCatalog(
    LocalPackageCatalog.InstalledPackages
);

var connectResult = await catalogRef.ConnectAsync();
if (connectResult.Status == ConnectResultStatus.Ok)
{
    // Search installed packages
    var options = new FindPackagesOptions();
    var result = await connectResult.PackageCatalog.FindPackagesAsync(options);
    
    Console.WriteLine($"Installed packages: {result.Matches.Count}");
}

GetPackageCatalogByName()

Gets a package catalog by its registered name.
catalogName
String
required
Name of the catalog (e.g., “winget”, “msstore”)
var manager = new PackageManager();
var catalogRef = manager.GetPackageCatalogByName("winget");

if (catalogRef != null)
{
    var info = catalogRef.Info;
    Console.WriteLine($"Found catalog: {info.Name}");
    Console.WriteLine($"Source: {info.Argument}");
}

CreateCompositePackageCatalog()

Creates a composite catalog that combines multiple catalogs for unified searching.
options
CreateCompositePackageCatalogOptions
required
Options for creating the composite catalog
var manager = new PackageManager();

var options = new CreateCompositePackageCatalogOptions()
{
    CompositeSearchBehavior = CompositeSearchBehavior.AllCatalogs
};

// Add winget and installed catalogs
options.Catalogs.Add(
    manager.GetPredefinedPackageCatalog(PredefinedPackageCatalog.OpenWindowsCatalog)
);
options.Catalogs.Add(
    manager.GetLocalPackageCatalog(LocalPackageCatalog.InstalledPackages)
);

var compositeCatalog = manager.CreateCompositePackageCatalog(options);
var connectResult = await compositeCatalog.ConnectAsync();

if (connectResult.Status == ConnectResultStatus.Ok)
{
    // Search across all catalogs
    var findOptions = new FindPackagesOptions();
    var result = await connectResult.PackageCatalog.FindPackagesAsync(findOptions);
}

AddPackageCatalogAsync()

Adds a new package catalog to the system.
options
AddPackageCatalogOptions
required
Options for the new catalog
Returns
IAsyncOperationWithProgress<AddPackageCatalogResult, Double>
Async operation with progress (0-100)
var manager = new PackageManager();

var options = new AddPackageCatalogOptions()
{
    Name = "contoso",
    SourceUri = "https://contoso.com/packages",
    Type = "Microsoft.PreIndexed.Package",
    TrustLevel = PackageCatalogTrustLevel.Trusted
};

var operation = manager.AddPackageCatalogAsync(options);
operation.Progress = (op, progress) =>
{
    Console.WriteLine($"Progress: {progress}%");
};

var result = await operation;
if (result.Status == AddPackageCatalogStatus.Ok)
{
    Console.WriteLine("Catalog added successfully");
}
else
{
    Console.WriteLine($"Failed: {result.Status}");
    Console.WriteLine($"Error: 0x{result.ExtendedErrorCode:X}");
}

Package Operation Methods

InstallPackageAsync()

Installs a package with the specified options.
package
CatalogPackage
required
The package to install
options
InstallOptions
required
Installation options
Returns
IAsyncOperationWithProgress<InstallResult, InstallProgress>
Async operation with installation progress
See Install Options for detailed options documentation.
var manager = new PackageManager();

// Assume 'package' was found via search
var options = new InstallOptions()
{
    PackageInstallMode = PackageInstallMode.Silent,
    PackageInstallScope = PackageInstallScope.User,
    AcceptPackageAgreements = true,
    LogOutputPath = @"C:\Logs\install.log"
};

var operation = manager.InstallPackageAsync(package, options);

operation.Progress = (op, progress) =>
{
    Console.WriteLine($"State: {progress.State}");
    
    switch (progress.State)
    {
        case PackageInstallProgressState.Downloading:
            Console.WriteLine($"Download: {progress.DownloadProgress * 100:F1}%");
            Console.WriteLine($"Downloaded: {progress.BytesDownloaded} / {progress.BytesRequired}");
            break;
            
        case PackageInstallProgressState.Installing:
            Console.WriteLine($"Install: {progress.InstallationProgress * 100:F1}%");
            break;
    }
};

var result = await operation;

if (result.Status == InstallResultStatus.Ok)
{
    Console.WriteLine("Installation successful!");
    if (result.RebootRequired)
    {
        Console.WriteLine("Reboot required to complete installation");
    }
}
else
{
    Console.WriteLine($"Installation failed: {result.Status}");
    Console.WriteLine($"Extended Error: 0x{result.ExtendedErrorCode:X8}");
    
    if (result.Status == InstallResultStatus.InstallError)
    {
        Console.WriteLine($"Installer returned: 0x{result.InstallerErrorCode:X}");
    }
}

UpgradePackageAsync()

Upgrades an installed package to a newer version.
package
CatalogPackage
required
The package to upgrade
options
InstallOptions
required
Upgrade options (uses InstallOptions)
var manager = new PackageManager();

// Get composite catalog to check for updates
var compositeOptions = new CreateCompositePackageCatalogOptions();
compositeOptions.Catalogs.Add(
    manager.GetPredefinedPackageCatalog(PredefinedPackageCatalog.OpenWindowsCatalog)
);
compositeOptions.Catalogs.Add(
    manager.GetLocalPackageCatalog(LocalPackageCatalog.InstalledPackages)
);
compositeOptions.CompositeSearchBehavior = CompositeSearchBehavior.RemotePackagesFromAllCatalogs;

var compositeCatalog = manager.CreateCompositePackageCatalog(compositeOptions);
var connectResult = await compositeCatalog.ConnectAsync();

// Find packages with updates
var findOptions = new FindPackagesOptions();
var findResult = await connectResult.PackageCatalog.FindPackagesAsync(findOptions);

foreach (var match in findResult.Matches)
{
    var package = match.CatalogPackage;
    if (package.IsUpdateAvailable)
    {
        Console.WriteLine($"Upgrading {package.Name}...");
        
        var upgradeOptions = new InstallOptions()
        {
            PackageInstallMode = PackageInstallMode.Silent,
            AllowUpgradeToUnknownVersion = true
        };
        
        var result = await manager.UpgradePackageAsync(package, upgradeOptions);
        Console.WriteLine($"Result: {result.Status}");
    }
}

UninstallPackageAsync()

Uninstalls a package from the system.
package
CatalogPackage
required
The package to uninstall
options
UninstallOptions
required
Uninstallation options
See Uninstall Options for details.
var manager = new PackageManager();

// Find installed package
var catalogRef = manager.GetLocalPackageCatalog(
    LocalPackageCatalog.InstalledPackages
);
var connectResult = await catalogRef.ConnectAsync();

var findOptions = new FindPackagesOptions();
findOptions.Selectors.Add(new PackageMatchFilter()
{
    Field = PackageMatchField.Id,
    Value = "Microsoft.PowerToys",
    Option = PackageFieldMatchOption.Equals
});

var findResult = await connectResult.PackageCatalog.FindPackagesAsync(findOptions);

if (findResult.Matches.Count > 0)
{
    var package = findResult.Matches[0].CatalogPackage;
    
    var uninstallOptions = new UninstallOptions()
    {
        PackageUninstallMode = PackageUninstallMode.Silent
    };
    
    var result = await manager.UninstallPackageAsync(package, uninstallOptions);
    
    if (result.Status == UninstallResultStatus.Ok)
    {
        Console.WriteLine("Uninstallation successful");
    }
}

DownloadPackageAsync()

Downloads a package installer without installing it.
package
CatalogPackage
required
The package to download
options
DownloadOptions
required
Download options
var manager = new PackageManager();

var downloadOptions = new DownloadOptions()
{
    DownloadDirectory = @"C:\Downloads\Packages",
    AcceptPackageAgreements = true,
    SkipDependencies = false
};

var operation = manager.DownloadPackageAsync(package, downloadOptions);

operation.Progress = (op, progress) =>
{
    if (progress.State == PackageDownloadProgressState.Downloading)
    {
        Console.WriteLine($"Downloaded: {progress.BytesDownloaded} / {progress.BytesRequired}");
        Console.WriteLine($"Progress: {progress.DownloadProgress * 100:F1}%");
    }
};

var result = await operation;

if (result.Status == DownloadResultStatus.Ok)
{
    Console.WriteLine($"Download complete. Files saved to: {downloadOptions.DownloadDirectory}");
}

Properties

Version

Gets the version of the Windows Package Manager.
Type
String
Version string (e.g., “1.7.10514”)
var manager = new PackageManager();
Console.WriteLine($"WinGet version: {manager.Version}");

Build docs developers (and LLMs) love