Procédure pas à pas : téléchargement d'assemblys à la demande avec l'API du déploiement ClickOnce à l'aide du concepteur

 

Date de publication : novembre 2016

Pour obtenir la dernière documentation sur Visual Studio 2017, consultez Documentation Visual Studio 2017.

Par défaut, tous les assemblys inclus dans une application ClickOnce sont téléchargés lors de la première exécution de l’application. Toutefois, il peut y avoir certaines parties de votre application qui sont utilisées par un petit ensemble d’utilisateurs. Dans ce cas, vous souhaiterez sans doute télécharger un assembly uniquement quand vous créez l’un de ses types. La procédure suivante montre comment marquer certains assemblys de votre application comme « facultatifs » et comment les télécharger à l’aide de classes dans l’espace de noms System.Deployment.Application quand le Common Language Runtime en a besoin.

System_CAPS_ICON_note.jpg Remarque

Votre application doit s’exécuter avec une confiance totale pour utiliser cette procédure.

System_CAPS_ICON_note.jpg Remarque

Les boîtes de dialogue et les commandes de menu qui s'affichent peuvent être différentes de celles qui sont décrites dans l'aide, en fonction de vos paramètres actifs ou de l'édition utilisée. Pour modifier ces paramètres, cliquez sur Importation et exportation de paramètres dans le menu Outils. Pour plus d’informations, consultez Personnalisation des paramètres de développement dans Visual Studio.

Pour créer un projet qui utilise un assembly à la demande avec Visual Studio

  1. Créez un projet Windows Forms dans Visual Studio. Dans le menu Fichier, pointez sur Ajouter, puis cliquez sur Nouveau projet. Choisissez un projet de Bibliothèque de classes dans la boîte de dialogue et nommez-le ClickOnceLibrary.

    System_CAPS_ICON_note.jpg Remarque

    Dans Visual Basic, nous vous recommandons de modifier les propriétés du projet pour affecter Microsoft.Samples.ClickOnceOnDemand ou un espace de noms de votre choix comme espace de noms racine pour ce projet. Pour des raisons de simplicité, les deux projets de cette procédure pas à pas sont dans le même espace de noms.

  2. Définissez une classe nommée DynamicClass avec une propriété unique nommée Message.

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Microsoft.Samples.ClickOnceOnDemand
    {
        public class DynamicClass
        {
            public DynamicClass() {}
    
            public string Message
            {
                get
                {
                    return ("Hello, world!");
                }
            }
        }
    }
    

  3. Sélectionnez le projet Windows Forms dans l’Explorateur de solutions. Ajoutez une référence à l’assembly System.Deployment.Application et une référence de projet au projet ClickOnceLibrary.

    System_CAPS_ICON_note.jpg Remarque

    Dans Visual Basic, nous vous recommandons de modifier les propriétés du projet pour affecter Microsoft.Samples.ClickOnceOnDemand ou un espace de noms de votre choix comme espace de noms racine pour ce projet. Pour des raisons de simplicité, les deux projets de cette procédure pas à pas figurent dans le même espace de noms.

  4. Cliquez avec le bouton droit sur le formulaire, cliquez sur Afficher le code dans le menu, puis ajoutez les références suivantes au formulaire.

    using System.Reflection;
    using System.Deployment.Application;
    using Microsoft.Samples.ClickOnceOnDemand;
    using System.Security.Permissions;
    

  5. Ajoutez le code suivant pour télécharger cet assembly à la demande. Ce code montre comment mapper un jeu d’assemblys à un nom de groupe à l’aide d’une classe Dictionary générique. Comme nous ne téléchargeons qu’un seul assembly dans cette procédure pas à pas, il n’y a qu’un seul assembly dans notre groupe. Dans une application réelle, il faudrait probablement télécharger simultanément tous les assemblys liés à une même fonctionnalité dans votre application. La table de mappage vous permet de le faire facilement en associant toutes les DLL qui appartiennent à une fonctionnalité à un nom de groupe de téléchargement.

            // Maintain a dictionary mapping DLL names to download file groups. This is trivial for this sample,
            // but will be important in real-world applications where a feature is spread across multiple DLLs,
            // and you want to download all DLLs for that feature in one shot. 
            Dictionary<String, String> DllMapping = new Dictionary<String, String>();
    
            [SecurityPermission(SecurityAction.Demand, ControlAppDomain=true)]
            public Form1()
            {
                InitializeComponent();
    
                DllMapping["ClickOnceLibrary"] = "ClickOnceLibrary";
                AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
            }
    
            /*
             * Use ClickOnce APIs to download the assembly on demand.
             */
            private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
            {
                Assembly newAssembly = null;
    
                if (ApplicationDeployment.IsNetworkDeployed)
                {
                    ApplicationDeployment deploy = ApplicationDeployment.CurrentDeployment;
    
                    // Get the DLL name from the Name argument.
                    string[] nameParts = args.Name.Split(',');
                    string dllName = nameParts[0];
                    string downloadGroupName = DllMapping[dllName];
    
                    try
                    {
                        deploy.DownloadFileGroup(downloadGroupName);
                    }
                    catch (DeploymentException de)
                    {
                        MessageBox.Show("Downloading file group failed. Group name: " + downloadGroupName + "; DLL name: " + args.Name);
                        throw (de);
                    }
    
                    // Load the assembly.
                    // Assembly.Load() doesn't work here, as the previous failure to load the assembly
                    // is cached by the CLR. LoadFrom() is not recommended. Use LoadFile() instead.
                    try
                    {
                        newAssembly = Assembly.LoadFile(Application.StartupPath + @"\" + dllName + ".dll");
                    }
                    catch (Exception e)
                    {
                        throw (e);
                    }
                }
                else
                {
                    //Major error - not running under ClickOnce, but missing assembly. Don't know how to recover.
                    throw (new Exception("Cannot load assemblies dynamically - application is not deployed using ClickOnce."));
                }
    
    
                return (newAssembly);
            }
    

  6. Dans le menu Affichage, cliquez sur Boîte à outils. Faites glisser un Button de la Boîte à outils vers le formulaire. Double-cliquez sur le bouton et ajoutez le code suivant au gestionnaire d’événements Click.

            private void getAssemblyButton_Click(object sender, EventArgs e)
            {
                DynamicClass dc = new DynamicClass();
                MessageBox.Show("Message: " + dc.Message);
            }
    

Pour marquer des assemblys comme facultatifs dans votre application ClickOnce à l’aide de Visual Studio

  1. Cliquez avec le bouton droit sur le projet Windows Forms dans l’Explorateur de solutions, puis cliquez sur Propriétés. Sélectionnez l’onglet Publier.

  2. Cliquez sur le bouton Fichiers d’application.

  3. Recherchez ClickOnceLibrary.dll dans la liste. Affectez la valeur Inclure à la zone de liste déroulante État de la publication.

  4. Développez la zone de liste déroulante Groupe et sélectionnez Nouveau. Entrez ClickOnceLibrary comme nom du nouveau groupe.

  5. Poursuivez la publication de votre application comme décrit dans How to: Publish a ClickOnce Application using the Publish Wizard.

Pour marquer des assemblys comme facultatifs dans votre application ClickOnce à l’aide de l’Outil Manifest Generation and Editing — Client graphique (MageUI.exe)

  1. Créez vos manifestes ClickOnce comme décrit dans Walkthrough: Manually Deploying a ClickOnce Application.

  2. Avant de fermer MageUI.exe, sélectionnez l’onglet qui contient le manifeste d’application de votre déploiement et, sous cet onglet, sélectionnez l’onglet Fichiers.

  3. Recherchez ClickOnceLibrary.dll dans la liste des fichiers d’application et affectez la valeur Aucun à sa colonne Type de fichier. Pour la colonne Groupe, tapez ClickOnceLibrary.dll.

Pour tester votre assembly à la demande

  1. Démarrez votre application déployée avec ClickOnce.

  2. Quand votre formulaire principal apparaît, appuyez sur Button. Une chaîne « Hello, World ! » doit apparaître dans une fenêtre de message.

ApplicationDeployment

Afficher: