Sdílet prostřednictvím


Průvodce: Stahování sestavení podle potřeby za použití API pro nasazení ClickOnce a vývojového prostředí Designer

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 režimu důvěry.

Poznámka:

Zobrazené dialogová okna a příkazy nabídek se můžou lišit od těch, které jsou popsány v nápovědě v závislosti na aktivním nastavení 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. Vytvořte nový projekt Windows Forms v sadě Visual Studio. 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, aby se kořenový obor názvů pro tento projekt změnil na Microsoft.Samples.ClickOnceOnDemand nebo na obor názvů dle vašeho výběru. Pro zjednodušení jsou dva projekty v tomto ukázkovém postupu ve stejném oboru názvů.

  2. Definujte třídu pojmenovanou DynamicClass s jedinou vlastností pojmenovanou 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íku řešení vyberte projekt Windows Forms. Přidejte odkaz na System.Deployment.Application sestavení a odkaz na ClickOnceLibrary projekt.

    Poznámka:

    V jazyce Visual Basic doporučujeme upravit vlastnost projektu tak, aby se změnil kořenový obor názvů pro tento projekt na Microsoft.Samples.ClickOnceOnDemand 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 Button z panelu nástrojů na formulář. Poklikejte na tlačítko a do obslužné rutiny události Click přidejte následující kód.

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

Označit sestavení jako nepovinná

Označit sestavení jako nepovinná v aplikaci ClickOnce pomocí nástroje Visual Studio

  1. V Průzkumníku řešení klikněte pravým tlačítkem myši na projekt Windows Forms 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ých v aplikaci ClickOnce pomocí nástroje MageUI.exe (grafický klient pro generování a úpravy manifestu)

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

  2. Před zavřením MageUI.exevyberte 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í

Otestujte 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ý zní "Hello, World!".