Mettre à jour les packages d’applications non stockées dans votre codeUpdate non-Store published app packages from your code

Lors de l’expédition de votre application en tant que MSIX, vous pouvez lancer par programmation une mise à jour de votre application.When shipping your app as an MSIX you can programmatically kick-off an update of your application. Si vous déployez votre application en dehors du magasin, il vous suffit de vérifier votre serveur pour obtenir une nouvelle version de votre application et d’installer la nouvelle version.If you deploy your app outside the Store, all you need to do is check your server for a new version of your app and install the new version. La façon dont vous appliquez la mise à jour varie selon que vous déployez votre package d’application à l’aide d’un fichier d’installation d’application ou non.How you apply the update depends on whether you are deploying your app package using an App Installer file or not. Pour appliquer des mises à jour à partir de votre code, votre package d’application doit déclarer la packageManagement fonctionnalité.In order to apply updates from your code, your app package must declare the packageManagement capability.

Cet article fournit des exemples qui montrent comment déclarer la packageManagement fonctionnalité dans votre manifeste de package et comment appliquer une mise à jour à partir de votre code.This article provides examples that demonstrate how to declare the packageManagement capability in your package manifest and how to apply an update from your code. La première section explique comment procéder si vous utilisez le fichier du programme d’installation de l’application et que la deuxième section explique comment le faire lorsque vous n’utilisez pas le fichier d’installation de l’application.The first section looks at how to do this if you're using the App Installer file and the second section is about how to do so when not using the App Installer file. La dernière section explique comment s’assurer que votre application redémarre après l’application d’une mise à jour.The last section looks at how to make sure your app restarts after an update has been applied.

Ajouter la fonctionnalité PackageManagement à votre manifeste de packageAdd the PackageManagement Capability to your package manifest

Pour utiliser les PackageManager API, votre application doit déclarer la packageManagement fonctionnalité restreinte dans votre manifeste de package.To use the PackageManager APIs, your app must declare the packageManagement restricted capability in your package manifest.

<Package>
...

  <Capabilities>
    <rescap:Capability Name="packageManagement" />
  </Capabilities>
  
...
</Package>

Mise à jour des packages déployés à l’aide d’un fichier d’installation d’applicationUpdating packages deployed using an App Installer file

Si vous déployez votre application à l’aide du fichier d’installation de l’application, toutes les mises à jour pilotées par le code que vous effectuez doivent utiliser les API de fichier du programme d’installationde l’application.If you are deploying your application using the App Installer file, any code driven updates you perform must make use of the App Installer file APIs. Cela permet de s’assurer que les mises à jour du fichier d’installation d’application régulière continuent de fonctionner.Doing so ensures that your regular App Installer file updates will continue to work. Pour l’initialisation une mise à jour basée sur un programme d’installation d’application à partir de votre code, vous pouvez utiliser packagemanager. AddPackageByAppInstallerFileAsync ou packagemanager. RequestAddPackageByAppInstallerFileAsync.For intiating an App Installer based update from your code you can use PackageManager.AddPackageByAppInstallerFileAsync or PackageManager.RequestAddPackageByAppInstallerFileAsync. Vous pouvez vérifier si une mise à jour est disponible à l’aide de l’API Package. CheckUpdateAvailabilityAsync .You can check if an update is available using the Package.CheckUpdateAvailabilityAsync API. Voici un exemple de code :Below is example code:

using Windows.Management.Deployment;

public async void CheckForAppInstallerUpdatesAndLaunchAsync(string targetPackageFullName, PackageVolume packageVolume)
{
    // Get the current app's package for the current user.
    PackageManager pm = new PackageManager();
    Package package = pm.FindPackageForUser(string.Empty, targetPackageFullName);

    PackageUpdateAvailabilityResult result = await package.CheckUpdateAvailabilityAsync();
    switch (result.Availability)
    {
        case PackageUpdateAvailability.Available:
        case PackageUpdateAvailability.Required:
            //Queue up the update and close the current instance
            await pm.AddPackageByAppInstallerFileAsync(
            new Uri("https://trial3.azurewebsites.net/HRApp/HRApp.appinstaller"),
            AddPackageByAppInstallerOptions.ForceApplicationShutdown,
            packageVolume);
            break;
        case PackageUpdateAvailability.NoUpdates:
            // Close AppInstaller.
            await ConsolidateAppInstallerView();
            break;
        case PackageUpdateAvailability.Unknown:
        default:
            // Log and ignore error.
            Logger.Log($"No update information associated with app {targetPackageFullName}");
            // Launch target app and close AppInstaller.
            await ConsolidateAppInstallerView();
            break;
    }
}

Mise à jour des packages déployés sans fichier d’installation d’applicationUpdating packages deployed without an App Installer file

Rechercher les mises à jour sur votre serveurCheck for updates on your server

Si vous n’utilisez pas le fichier d’installation d’application pour déployer votre package d’application, la première étape consiste à vérifier directement si une nouvelle version de votre application est disponible.If you are not using the App Installer file to deploy your app package, the first step is to directly check if a new version of your application available. L’exemple suivant vérifie si la version du package sur un serveur est supérieure à la version actuelle de l’application (cet exemple fait référence à un serveur de test à des fins de démonstration).The following example checks to see of the version of the package on a server is greater than the current version of the app (this example refers to a test server for demonstration purposes).

using Windows.Management.Deployment;

//check for an update on my server
private async void CheckUpdate(object sender, TappedRoutedEventArgs e)
{
    WebClient client = new WebClient();
    Stream stream = client.OpenRead("https://trial3.azurewebsites.net/HRApp/Version.txt");
    StreamReader reader = new StreamReader(stream);
    var newVersion = new Version(await reader.ReadToEndAsync());
    Package package = Package.Current;
    PackageVersion packageVersion = package.Id.Version;
    var currentVersion = new Version(string.Format("{0}.{1}.{2}.{3}", packageVersion.Major, packageVersion.Minor, packageVersion.Build, packageVersion.Revision));

    //compare package versions
    if (newVersion.CompareTo(currentVersion) > 0)
    {
        var messageDialog = new MessageDialog("Found an update.");
        messageDialog.Commands.Add(new UICommand(
            "Update",
            new UICommandInvokedHandler(this.CommandInvokedHandler)));
        messageDialog.Commands.Add(new UICommand(
            "Close",
            new UICommandInvokedHandler(this.CommandInvokedHandler)));
        messageDialog.DefaultCommandIndex = 0;
        messageDialog.CancelCommandIndex = 1;
        await messageDialog.ShowAsync();
    } else
    {
        var messageDialog = new MessageDialog("Did not find an update.");
        await messageDialog.ShowAsync();
    }
}

Appliquer la mise à jourApply the update

Une fois que vous avez déterminé qu’une mise à jour est disponible, vous pouvez la mettre en file d’attente pour le télécharger et l’installer à l’aide de l’API AddPackageAsync .After you determined that an update is available, you can queue it up for download and install using the AddPackageAsync API. La mise à jour sera appliquée lors de la prochaine arrêt de votre application.The update will be applied the next time your app is shut down. Une fois l’application redémarrée, la nouvelle version est disponible pour l’utilisateur.After the app is restarted, the new version will be available to the user. Voici un exemple de code :Below is example code:


// Queue up the update and close the current app instance.
private async void CommandInvokedHandler(IUICommand command)
{
    if (command.Label == "Update")
    {
        PackageManager packagemanager = new PackageManager();
        await packagemanager.AddPackageAsync(
            new Uri("https://trial3.azurewebsites.net/HRApp/HRApp.msix"),
            null,
            AddPackageOptions.ForceApplicationShutdown
        );
    }
}

Redémarrage automatique de votre application après une mise à jourAutomatically restarting your app after an update

Si votre application est une application UWP, le passage de AddPackageByAppInstallerOptions. ForceApplicationShutdown ou AddPackageOptions. ForceTargetAppShutdown lors de l’application d’une mise à jour doit planifier le redémarrage de l’application après l’arrêt + la mise à jour.If your application is a UWP app, passing in AddPackageByAppInstallerOptions.ForceApplicationShutdown OR AddPackageOptions.ForceTargetAppShutdown when applying an update should schedule the app to restart after the shutdown + update. Pour les applications non UWP, vous devez appeler RegisterApplicationRestart avant d’appliquer la mise à jour.For non-UWP apps you need to call RegisterApplicationRestart before applying the update.

Vous devez appeler RegisterApplicationRestart avant que votre application commence à s’arrêter.You must call RegisterApplicationRestart before your app begins to shut down. Vous trouverez ci-dessous un exemple d’utilisation de Interop services pour appeler la méthode Native en C# :Below is an example of doing so using interop services to call the native method in C#:

 // Register the active instance of an application for restart in your Update method
 uint res = RelaunchHelper.RegisterApplicationRestart(null, RelaunchHelper.RestartFlags.NONE);

Exemple de la classe d’assistance pour appeler la méthode Native RegisterApplicationRestart en C# :An example of the helper class to call the native RegisterApplicationRestart method in C#:

using System;
using System.Runtime.InteropServices;

namespace MyEmployees.Helpers
{
    class RelaunchHelper
    {
        #region Restart Manager Methods
        /// <summary>
        /// Registers the active instance of an application for restart.
        /// </summary>
        /// <param name="pwzCommandLine">
        /// A pointer to a Unicode string that specifies the command-line arguments for the application when it is restarted.
        /// The maximum size of the command line that you can specify is RESTART_MAX_CMD_LINE characters. Do not include the name of the executable
        /// in the command line; this function adds it for you.
        /// If this parameter is NULL or an empty string, the previously registered command line is removed. If the argument contains spaces,
        /// use quotes around the argument.
        /// </param>
        /// <param name="dwFlags">One of the options specified in RestartFlags</param>
        /// <returns>
        /// This function returns S_OK on success or one of the following error codes:
        /// E_FAIL for internal error.
        /// E_INVALIDARG if rhe specified command line is too long.
        /// </returns>
        [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
        internal static extern uint RegisterApplicationRestart(string pwzCommandLine, RestartFlags dwFlags);
        #endregion Restart Manager Methods

        #region Restart Manager Enums
        /// <summary>
        /// Flags for the RegisterApplicationRestart function
        /// </summary>
        [Flags]
        internal enum RestartFlags
        {
            /// <summary>None of the options below.</summary>
            NONE = 0,

            /// <summary>Do not restart the process if it terminates due to an unhandled exception.</summary>
            RESTART_NO_CRASH = 1,
            /// <summary>Do not restart the process if it terminates due to the application not responding.</summary>
            RESTART_NO_HANG = 2,
            /// <summary>Do not restart the process if it terminates due to the installation of an update.</summary>
            RESTART_NO_PATCH = 4,
            /// <summary>Do not restart the process if the computer is restarted as the result of an update.</summary>
            RESTART_NO_REBOOT = 8
        }
        #endregion Restart Manager Enums

    }
}