Návod: Stahování sestavení na vyžádání pomocí rozhraní API pro nasazení ClickOnce pomocí Návrháře

Ve výchozím nastavení se všechna sestavení zahrnutá v aplikaci ClickOnce stáhnou při prvním spuštění aplikace. Můžou ale existovat části vaší aplikace, které používají malá skupina uživatelů. V tomto případě chcete stáhnout sestavení pouze v případě, že vytvoříte jeden z jeho typů. Následující názorný postup ukazuje, jak označit určitá sestavení v aplikaci jako volitelná a jak je stáhnout pomocí tříd v System.Deployment.Application oboru názvů, když je common language runtime požaduje.

Poznámka:

Třída ApplicationDeployment a rozhraní API v System.Deployment.Application oboru názvů nejsou podporovány v .NET Core a .NET 5 a novějších verzích. V .NET 7 se podporuje nová metoda přístupu k vlastnostem nasazení aplikace. Další informace naleznete v tématu Access ClickOnce vlastnosti nasazení v .NET. .NET 7 nepodporuje ekvivalent metod ApplicationDeployment.

Poznámka:

Aby bylo možné tento postup použít, musí vaše aplikace běžet v plném vztahu důvěryhodnosti.

Poznámka:

Dialogová okna a příkazy nabídek, které vidíte, se mohou lišit od těch popsaných v nápovědě v závislosti na aktivních nastaveních nebo edici. Chcete-li změnit nastavení, klepněte na tlačítko Importovat a exportovat Nastavení v nabídce Nástroje. Další informace najdete v tématu Resetování nastavení.

Vytvoření projektů

Vytvoření projektu, který používá sestavení na vyžádání se sadou Visual Studio

  1. V sadě Visual Studio vytvořte nový projekt model Windows Forms. V nabídce Soubor přejděte na příkaz Přidat a klepněte na tlačítko Nový projekt. V dialogovém okně zvolte projekt knihovny tříd a pojmenujte ho ClickOnceLibrary.

    Poznámka:

    V jazyce Visual Basic doporučujeme upravit vlastnosti projektu tak, aby změnily kořenový obor názvů pro tento projekt na Microsoft.Samples.ClickOnceOnDemand obor názvů nebo na obor názvů podle vašeho výběru. Pro zjednodušení jsou dva projekty v tomto názorném postupu ve stejném oboru názvů.

  2. Definujte třídu s DynamicClass jednou vlastností s názvem 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 Průzkumník řešení vyberte projekt model Windows Forms. Přidejte odkaz na System.Deployment.Application sestavení a odkaz na ClickOnceLibrary projekt.

    Poznámka:

    V jazyce Visual Basic doporučujeme upravit vlastnosti projektu tak, aby změnily kořenový obor názvů pro tento projekt na Microsoft.Samples.ClickOnceOnDemand obor názvů nebo na obor názvů podle vašeho výběru. Pro zjednodušení jsou dva projekty v tomto názorném postupu umístěny ve stejném oboru názvů.

  4. Klikněte pravým tlačítkem myši na formulář, v nabídce klikněte na Zobrazit kód a přidejte do formuláře následující odkazy.

    using System.Reflection;
    using System.Deployment.Application;
    using Microsoft.Samples.ClickOnceOnDemand;
    using System.Security.Permissions;
    
  5. Přidejte následující kód pro stažení tohoto sestavení na vyžádání. Tento kód ukazuje, jak mapovat sadu sestavení na název skupiny pomocí obecné Dictionary třídy. Vzhledem k tomu, že v tomto návodu stahujeme pouze jedno sestavení, existuje v naší skupině pouze jedno sestavení. Ve skutečné aplikaci byste pravděpodobně chtěli stáhnout všechna sestavení související s jednou funkcí ve vaší aplikaci současně. Tabulka mapování vám to umožňuje snadno přidružovat všechny knihovny DLL, které patří do funkce s názvem skupiny stahování.

    // 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. V nabídce Zobrazení klikněte na Panel nástrojů. Přetáhněte z Button panelu nástrojů do formuláře. Poklikejte na tlačítko a do obslužné rutiny události přidejte následující kód Click .

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

Označení sestavení jako nepovinných

Označení sestavení jako nepovinných v aplikaci ClickOnce pomocí sady Visual Studio

  1. Klikněte pravým tlačítkem myši na projekt model Windows Forms v Průzkumník řešení a klikněte na příkaz Vlastnosti. Vyberte kartu Publikovat.

  2. Klikněte na tlačítko Soubory aplikace.

  3. Vyhledejte výpis pro ClickOnceLibrary.dll. Nastavte rozevírací seznam Publikovat stav na Zahrnout.

  4. Rozbalte rozevírací seznam Skupina a vyberte Nový. Jako název nové skupiny zadejte název ClickOnceLibrary .

  5. Pokračujte v publikování aplikace podle postupu : Publikování aplikace ClickOnce pomocí Průvodce publikováním.

Označení sestavení jako volitelná v aplikaci ClickOnce pomocí nástroje pro generování a úpravy manifestu – grafický klient (MageUI.exe)

  1. Vytvořte manifesty ClickOnce, jak je popsáno v návodu: Ruční nasazení aplikace ClickOnce.

  2. Před zavřením MageUI.exe vyberte kartu, která obsahuje manifest aplikace vašeho nasazení, a na této kartě vyberte kartu Soubory .

  3. V seznamu souborů aplikace vyhledejte ClickOnceLibrary.dll a nastavte jeho sloupec Typ souboru na Hodnotu Žádné. Do sloupce Seskupování zadejte ClickOnceLibrary.dll.

Otestování nového sestavení

Testování sestavení na vyžádání:

  1. Spusťte aplikaci nasazenou pomocí ClickOnce.

  2. Jakmile se zobrazí hlavní formulář, stiskněte klávesu Button. V okně se zprávou by se měl zobrazit řetězec, který přečte text "Hello, World!".