Procédure pas à pas : Télécharger des assemblys à la demande avec l’API de déploiement ClickOnce
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 de vos 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.
Notes
La classe ApplicationDeployment et les API de l’espace de noms System.Deployment.Application ne sont pas prises en charge dans .NET Core, .NET 5 et les versions ultérieures. Dans .NET 7, une nouvelle méthode d’accès aux propriétés de déploiement d’application est prise en charge. Pour plus d’informations, consultez Accéder aux propriétés de déploiement ClickOnce dans .NET. .NET 7 ne prend pas en charge l’équivalent des méthodes ApplicationDeployment.
Remarque
Votre application doit s’exécuter avec une confiance totale pour utiliser cette procédure.
Prérequis
Pour exécuter cette procédure pas à pas, vous devrez disposer des composants suivants :
SDK Windows SDK Windows peut être téléchargé depuis le Centre de téléchargement Microsoft.
Visual Studio.
Créer les projets
Pour créer un projet qui utilise un assembly à la demande
Créez un répertoire nommé ClickOnceOnDemand.
Ouvrez l’invite de commandes SDK Windows ou l’invite de commandes Visual Studio.
Accédez au répertoire ClickOnceOnDemand.
Générez une paire de clés publique/privée à l’aide de la commande suivante :
sn -k TestKey.snk
À l’aide du Bloc-notes ou d’un autre éditeur de texte, définissez une classe nommée
DynamicClass
avec une seule propriété nomméeMessage
.Enregistrez le texte sous forme de fichier nommé ClickOnceLibrary.cs ou ClickOnceLibrary.vb, selon la langue que vous utilisez, dans le répertoire ClickOnceOnDemand .
Compilez le fichier dans un assembly.
Pour obtenir le jeton de clé publique pour l’assembly, utilisez la commande suivante :
sn -T ClickOnceLibrary.dll
Créez un fichier à l’aide de votre éditeur de texte et entrez le code suivant. Ce code crée une application Windows Forms qui télécharge l’assembly ClickOnceLibrary lorsque cela est nécessaire.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Reflection; using System.Deployment.Application; using Microsoft.Samples.ClickOnceOnDemand; namespace ClickOnceOnDemand { [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, Unrestricted=true)] public class Form1 : Form { // 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>(); public static void Main() { Form1 NewForm = new Form1(); Application.Run(NewForm); } public Form1() { // Configure form. this.Size = new Size(500, 200); Button getAssemblyButton = new Button(); getAssemblyButton.Size = new Size(130, getAssemblyButton.Size.Height); getAssemblyButton.Text = "Test Assembly"; getAssemblyButton.Location = new Point(50, 50); this.Controls.Add(getAssemblyButton); getAssemblyButton.Click += new EventHandler(getAssemblyButton_Click); 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," + "Version=1.0.0.0, Culture=en, PublicKeyToken=03689116d3a4ae33"); } 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); } private void getAssemblyButton_Click(object sender, EventArgs e) { DynamicClass dc = new DynamicClass(); MessageBox.Show("Message: " + dc.Message); } } }
Dans le code, recherchez l’appel à LoadFile.
Définissez
PublicKeyToken
sur la valeur que vous avez récupérée précédemment.Enregistrez le fichier au format Form1.cs ou Form1.vb.
Compilez-le dans un exécutable à l’aide de la commande suivante.
Marquer les assemblys comme facultatifs
Pour marquer des assemblys comme facultatifs dans votre application ClickOnce à l’aide de MageUI.exe
À l’aide de MageUI.exe, créez un manifeste d’application comme décrit dans Procédure pas à pas : Déployer manuellement une application ClickOnce. Utilisez les paramètres suivants pour le manifeste de l’application :
Nommez le manifeste de l’application
ClickOnceOnDemand
.Sur la page Fichiers, dans la ligne ClickOnceLibrary.dll, définissez la colonne Type de fichier sur Aucun.
Sur la page Fichiers, dans la ligne ClickOnceLibrary.dll, tapez
ClickOnceLibrary.dll
dans la colonne Groupe .
À l’aide de MageUI.exe, créez un manifeste de déploiement comme décrit dans Procédure pas à pas : Déployer manuellement une application ClickOnce. Utilisez les paramètres suivants pour le manifeste de déploiement :
- Nommez le manifeste de déploiement
ClickOnceOnDemand
.
- Nommez le manifeste de déploiement
Test du nouvel assembly
Pour tester votre assembly à la demande
Chargez votre déploiement ClickOnce sur un serveur web.
Démarrez votre application déployée avec ClickOnce à partir d’un navigateur web en entrant l’URL du manifeste de déploiement. Si vous appelez votre application ClickOnce
ClickOnceOnDemand
et que vous la chargez dans le répertoire racine de adatum.com, votre URL se présente comme suit :http://www.adatum.com/ClickOnceOnDemand/ClickOnceOnDemand.application
Quand votre formulaire principal apparaît, appuyez sur Button. Une chaîne « Hello, World ! » doit apparaître dans une fenêtre de message.