Delen via


Stapsgewijze uitleg: Assemblies op aanvraag downloaden met de ClickOnce-implementatie-API met behulp van de ontwerper

Standaard worden alle assembly's die zijn opgenomen in een ClickOnce-toepassing gedownload wanneer de toepassing voor het eerst wordt uitgevoerd. Er kunnen echter onderdelen van uw toepassing zijn die worden gebruikt door een kleine set gebruikers. In dit geval wilt u een assembly alleen downloaden wanneer u een van de typen ervan maakt. In de volgende procedure ziet u hoe u bepaalde assembly's in uw toepassing markeert als 'optioneel' en hoe u deze kunt downloaden met behulp van klassen in de System.Deployment.Application naamruimte wanneer de algemene taalruntime deze vereist.

Opmerking

De ApplicationDeployment klasse en API's in de System.Deployment.Application naamruimte worden niet ondersteund in .NET Core en .NET 5 en latere versies. In .NET 7 wordt een nieuwe methode voor het openen van toepassingsimplementatie-eigenschappen ondersteund. Zie Access ClickOnce-implementatie-eigenschappen in .NET voor meer informatie. .NET 7 biedt geen ondersteuning voor het equivalent van ApplicationDeployment-methoden.

Opmerking

Uw toepassing moet in volledige vertrouwen draaien om deze procedure te kunnen gebruiken.

Opmerking

De dialoogvensters en menuopdrachten die u ziet, kunnen afwijken van de dialoogvensters die worden beschreven in Help, afhankelijk van uw actieve instellingen of editie. Klik op Import- en exportinstellingen in het menu Extra om uw instellingen te wijzigen. Zie Instellingen opnieuw instellen voor meer informatie.

De projecten maken

Een project maken dat gebruikmaakt van een assembly op aanvraag met Visual Studio

  1. Maak een nieuw Windows Forms-project in Visual Studio. Wijs in het menu Bestand de optie Toevoegen aan en klik vervolgens op Nieuw project. Kies een Class Library-project in het dialoogvenster en geef het een ClickOnceLibrarynaam.

    Opmerking

    In Visual Basic wordt u aangeraden de projecteigenschappen te wijzigen om de hoofdnaamruimte voor dit project te wijzigen in Microsoft.Samples.ClickOnceOnDemand of in een naamruimte van uw keuze. Ter vereenvoudiging bevinden de twee projecten in dit scenario zich in dezelfde naamruimte.

  2. Definieer een klasse met een naam DynamicClass met één eigenschap met de naam 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. Selecteer het Windows Forms-project in Solution Explorer. Voeg een verwijzing naar de System.Deployment.Application assembly en een projectreferentie toe aan het ClickOnceLibrary project.

    Opmerking

    In Visual Basic wordt u aangeraden de projecteigenschappen te wijzigen om de hoofdnaamruimte voor dit project te wijzigen in Microsoft.Samples.ClickOnceOnDemand of in een naamruimte van uw keuze. Ter vereenvoudiging bevinden de twee projecten in dit scenario zich in dezelfde naamruimte.

  4. Klik met de rechtermuisknop op het formulier, klik op Code weergeven in het menu en voeg de volgende verwijzingen toe aan het formulier.

    using System.Reflection;
    using System.Deployment.Application;
    using Microsoft.Samples.ClickOnceOnDemand;
    using System.Security.Permissions;
    
  5. Voeg de volgende code toe om deze assembly op aanvraag te downloaden. Deze code laat zien hoe u een set assembly’s kunt toewijzen aan een groepsnaam met behulp van een generieke Dictionary klasse. Omdat we slechts één assembly in deze handleiding downloaden, is er maar één assembly in onze groep. In een echte toepassing wilt u waarschijnlijk alle assembly's met betrekking tot één functie in uw toepassing tegelijk downloaden. Met de toewijzingstabel kunt u dit eenvoudig doen door alle DLL's die deel uitmaken van een functie te koppelen aan een downloadgroepnaam.

    // 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. Klik in het menu Beeld op Werkbalk. Sleep een Button van de Toolbox naar het formulier. Dubbelklik op de knop en voeg de volgende code toe aan de Click gebeurtenis-handler.

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

Assemblages markeren als optioneel

Assemblages als optioneel markeren in uw ClickOnce-toepassing met behulp van Visual Studio

  1. Klik met de rechtermuisknop op het Windows Forms-project in Solution Explorer en klik op Eigenschappen. Selecteer het tabblad Publiceren .

  2. Klik op de knop Toepassingsbestanden .

  3. Zoek de vermelding voor ClickOnceLibrary.dll. Stel de vervolgkeuzelijst Publicatiestatus in op Opnemen.

  4. Vouw de vervolgkeuzelijst Groep uit en selecteer Nieuw. Voer de naam ClickOnceLibrary in als de nieuwe groepsnaam.

  5. Ga door met het publiceren van uw toepassing, zoals beschreven in Procedure: Een ClickOnce-toepassing publiceren met behulp van de wizard Publiceren.

Assembly's als optioneel markeren in uw ClickOnce-toepassing met gebruik van het hulpprogramma voor het genereren en bewerken van manifesten (grafische client) (MageUI.exe)

  1. Maak uw ClickOnce-manifesten zoals beschreven in Walkthrough: Een ClickOnce-toepassing handmatig implementeren.

  2. Voordat u MageUI.exesluit, selecteert u het tabblad met het toepassingsmanifest van uw implementatie en selecteert u op dat tabblad het tabblad Bestanden .

  3. Zoek ClickOnceLibrary.dll in de lijst met toepassingsbestanden en stel de kolom Bestandstype in op Geen. Voor de kolom Groep typt u ClickOnceLibrary.dll.

De nieuwe assembly testen

Om uw on-demand assembly te testen:

  1. Start uw toepassing die is geïmplementeerd met ClickOnce.

  2. Wanneer het hoofdformulier wordt weergegeven, drukt u op de Buttonknop . U ziet nu een tekenreeks in een berichtvenster met de tekst 'Hallo, wereld!'