Dela via


Genomgång: Ladda ned sammansättningar på begäran med ClickOnce-distributions-API:et med hjälp av designern

Som standard laddas alla sammansättningar som ingår i ett ClickOnce-program ned när programmet körs första gång. Det kan dock finnas delar av ditt program som används av en liten uppsättning användare. I det här fallet vill du bara ladda ned en sammansättning när du skapar en av dess typer. Följande genomgång visar hur du markerar vissa sammansättningar i ditt program som "valfria" och hur du laddar ned dem med hjälp av klasser i System.Deployment.Application namnområdet när den vanliga språkkörningen kräver dem.

Anmärkning

Klassen ApplicationDeployment och API:erna System.Deployment.Application i namnområdet stöds inte i .NET Core- och .NET 5- och senare versioner. I .NET 7 stöds en ny metod för att komma åt egenskaper för programdistribution. Mer information finns i Access ClickOnce distributionsegenskaper i .NET. .NET 7 stöder inte motsvarigheten till ApplicationDeployment-metoder.

Anmärkning

Din applikation måste köras med fullständiga rättigheter för att kunna använda denna procedur.

Anmärkning

De dialogrutor och menykommandon som du ser kan skilja sig från de som beskrivs i Hjälp beroende på dina aktiva inställningar eller utgåva. Om du vill ändra inställningarna klickar du på Importera och exportera inställningar verktygsmenyn. Mer information finns i Återställ inställningar.

Skapa projekten

Skapa ett projekt som använder en sammansättning på begäran med Visual Studio

  1. Skapa ett nytt Windows Forms-projekt i Visual Studio. Peka på Lägg tillArkiv-menyn och klicka sedan på Nytt projekt. Välj ett klassbiblioteksprojekt i dialogrutan och ge det ClickOnceLibrarynamnet .

    Anmärkning

    I Visual Basic rekommenderar vi att du ändrar projektegenskaperna för att ändra rotnamnområdet för projektet till Microsoft.Samples.ClickOnceOnDemand eller till ett valfritt namnområde. För enkelhetens skull finns de två projekten i den här genomgången i samma namnrymd.

  2. Definiera en klass med namnet DynamicClass med en enda egenskap med namnet 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. Välj Windows Forms-projektet i Solution Explorer. Lägg till en referens till System.Deployment.Application sammansättningen och en projektreferens till ClickOnceLibrary projektet.

    Anmärkning

    I Visual Basic rekommenderar vi att du ändrar projektegenskaperna för att ändra rotnamnområdet för projektet till Microsoft.Samples.ClickOnceOnDemand eller till ett valfritt namnområde. För enkelhetens skull finns de två projekten i den här genomgången i samma namnområde.

  4. Högerklicka på formuläret, klicka på Visa kod på menyn och lägg till följande referenser i formuläret.

    using System.Reflection;
    using System.Deployment.Application;
    using Microsoft.Samples.ClickOnceOnDemand;
    using System.Security.Permissions;
    
  5. Lägg till följande kod för att ladda ned den här sammansättningen på begäran. Den här koden visar hur du mappar en uppsättning sammansättningar till ett gruppnamn med hjälp av en allmän Dictionary klass. Eftersom vi bara laddar ned en enskild sammansättning i den här genomgången finns det bara en sammansättning i vår grupp. I ett riktigt program skulle du förmodligen vilja ladda ned alla sammansättningar som är relaterade till en enda funktion i ditt program samtidigt. Med mappningstabellen kan du enkelt göra detta genom att associera alla DLL:er som tillhör en funktion med ett namn på nedladdningsgruppen.

    // 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. På menyn Visa klickar du på Verktygslåda. Dra en Button från verktygslådan till formuläret. Dubbelklicka på knappen och lägg till följande kod i Click händelsehanteraren.

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

Markera sammansättningar som valfria

Markera sammansättningar som valfria i ditt ClickOnce-program med hjälp av Visual Studio

  1. Högerklicka på Windows Forms-projektet i Solution Explorer och klicka på Egenskaper. Välj fliken Publicera .

  2. Klicka på knappen Programfiler .

  3. Hitta listan för ClickOnceLibrary.dll. Ange listrutan Publiceringsstatus till Inkludera.

  4. Expandera listrutan Grupp och välj Ny. Ange namnet ClickOnceLibrary som det nya gruppnamnet.

  5. Fortsätt att publicera programmet enligt beskrivningen i Så här: Publicera ett ClickOnce-program med hjälp av publiceringsguiden.

Markera sammansättningar som valfria i ditt ClickOnce-program med hjälp av manifestgenererings- och redigeringsverktyget – grafisk klient (MageUI.exe)

  1. Skapa dina ClickOnce-manifest enligt beskrivningen i Genomgång: Distribuera ett ClickOnce-program manuellt.

  2. Innan du stänger MageUI.exeväljer du fliken som innehåller distributionens programmanifest, och på den fliken väljer du fliken Filer .

  3. Leta upp ClickOnceLibrary.dll i listan över programfiler och ange kolumnen Filtyp till Ingen. I kolumnen Grupp skriver du ClickOnceLibrary.dll.

Testa den nya sammansättningen

Så här testar du den efterfrågade sammansättningen:

  1. Starta ditt program som distribuerats med ClickOnce.

  2. När huvudformuläret visas trycker du på Button. Du bör se en sträng i ett meddelanderutefönster med texten "Hello, World!"