Sdílet prostřednictvím


Názorný postup: Stahování sestavení na požádání s nasazení technologie ClickOnce rozhraní API pomocí Návrháře

Dle výchozího nastavení jsou všechna sestavení, která jsou součástí aplikace ClickOnce, stažena při prvním spuštění aplikace. Mohou však existovat části aplikace, které jsou používány malou skupinou uživatelů.V tomto případě chcete stáhnout sestavení pouze tehdy, když vytváříte jeden z jeho typů.Následující návod ukazuje, jak označit určité sestavení v aplikaci jako "volitelné" a jak je stáhnout pomocí tříd v oboru názvů System.Deployment.Application, když je modul CLR (Common Language Runtime) požaduje.

[!POZNÁMKA]

Aplikace bude muset být spuštěna v úplném vztahu důvěryhodnosti k použití této procedury.

[!POZNÁMKA]

Dialogová okna a příkazy v nabídkách menu, které vidíte, se mohou lišit od těch popsaných v nápovědě, v závislosti na vašich aktivních nastaveních nebo edici.Chcete-li změnit nastavení, zvolte Import a Export nastavení v nabídce Nástroje.Další informace naleznete v tématu Nastavení aplikace Visual Studio.

Vytváření projektů

Chcete-li vytvořit projekt, který používá sestavení na vyžádání pomocí Visual Studia

  1. Vytvořte nový projekt modelu Windows Forms v Visual Studio. V nabídce Soubor přejděte na Přidat a klikněte na Nový projekt.Zvolte projekt Knihovna tříd v dialogovém okně a pojmenujte jej ClickOnceLibrary.

    [!POZNÁMKA]

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

  2. Definujte třídu s názvem DynamicClass s jedinou vlastností s názvem Message.

    Public Class DynamicClass
        Sub New()
    
        End Sub
    
        Public ReadOnly Property Message() As String
            Get
                Message = "Hello, world!"
            End Get
        End Property
    End Class
    
    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. Zvolte projekt Windows Forms v Průzkumníku řešení.Přidejte odkaz do sestavení System.Deployment.Application a odkaz projektu do projektu ClickOnceLibrary.

    [!POZNÁMKA]

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

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

    Imports System.Reflection
    Imports System.Deployment.Application
    Imports System.Collections.Generic
    Imports Microsoft.Samples.ClickOnceOnDemand
    Imports System.Security.Permissions
    
    using System.Reflection;
    using System.Deployment.Application;
    using Microsoft.Samples.ClickOnceOnDemand;
    using System.Security.Permissions;
    
  5. Přidejte následující kód pro stážení toto sestavení na požádání.Tento kód ukazuje, jak mapovat sadu sestavení do názvu skupiny pomocí obecné třídy Dictionary.Protože v tomto návodu stahujete pouze jediné sestavení, je v naší skupině pouze jedno sestavení.V reálné aplikaci byste pravděpodobně chtěli stáhnout všechna sestavení spojené s jedinou funkcí v aplikaci současně.Mapovací tabulka umožňuje toto provést snadno pomocí přidružení všech knihoven DLL, které patří do funkce s názvem skupiny stažení.

    ' 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. 
    Dim DllMappingTable As New Dictionary(Of String, String)()
    
    <SecurityPermission(SecurityAction.Demand, ControlAppDomain:=True)> _
    Sub New()
        ' This call is required by the Windows Form Designer.
        InitializeComponent()
    
        ' Add any initialization after the InitializeComponent() call.
        DllMappingTable("ClickOnceLibrary") = "ClickOnceLibrary"
    End Sub
    
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf Me.CurrentDomain_AssemblyResolve
    End Sub
    
    Private Function CurrentDomain_AssemblyResolve(ByVal sender As Object, ByVal args As ResolveEventArgs) As System.Reflection.Assembly
        Dim NewAssembly As Assembly = Nothing
    
        If (ApplicationDeployment.IsNetworkDeployed) Then
            Dim Deploy As ApplicationDeployment = ApplicationDeployment.CurrentDeployment
    
            ' Get the DLL name from the argument.
            Dim NameParts As String() = args.Name.Split(",")
            Dim DllName As String = NameParts(0)
            Dim DownloadGroupName As String = DllMappingTable(DllName)
    
            Try
                Deploy.DownloadFileGroup(DownloadGroupName)
            Catch ex As Exception
                MessageBox.Show("Could not download file group from Web server. Contact administrator. Group name: " & DownloadGroupName & "; DLL name: " & args.Name)
                Throw (ex)
            End Try
    
            ' 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 ex As Exception
                Throw (ex)
            End Try
        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.")
        End If
    
        Return NewAssembly
    End Function
    
    // 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 Zobrazit klepněte na příkaz Sada nástrojů.Přetáhněte Button z Panelu nástrojů do formuláře.Poklikejte na tlačítko a přidejte následující kód do obslužné rutiny Click:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim DC As New DynamicClass()
        MessageBox.Show("Message is " & DC.Message)
    End Sub
    
    private void getAssemblyButton_Click(object sender, EventArgs e)
    {
        DynamicClass dc = new DynamicClass();
        MessageBox.Show("Message: " + dc.Message);
    }
    

Označování sestavení jako volitelné

Pro označení sestavení jako volitelné v aplikaci ClickOnce pomocí Visual Studia

  1. Klikněte pravým tlačítkem myši na projekt v Průzkumníku řešení a potom klikněte na Vlastnosti.Zvolte kartu Publikovat.

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

  3. Vyhledejte výpis pro ClickOnceLibrary.dll.Nastavte rozevírací seznam Stav publikování na Zahrnout.

  4. Rozbalte rozevírací seznam Skupina a zvolte Nová.Zadejte název ClickOnceLibrary jako název nové skupiny.

  5. Pokračujte v publikování aplikace, jak je popsáno v Jak: publikování aplikace technologie ClickOnce pomocí Průvodce publikováním.

Pro označení sestavení jako volitelné v aplikaci ClickOnce pomocí editačního nástroje a generování manifestu – Grafický klient (MageUI.exe)

  1. Vytvořte Vaše manifesty ClickOnce, jak je popsáno v Názorný postup: Ručně nasazení technologie ClickOnce aplikace.

  2. Před zavřením MageUI.exe zvolte kartu, která obsahuje manifest aplikace Vašeho nasazení a v rámci této karty zvolte kartu Soubory.

  3. Vyhledejte ClickOnceLibrary.dll v seznamu souborů aplikace a nastavte jeho sloupec Typ Souboru na Žádný.Pro sloupec Skupina zapište ClickOnceLibrary.dll.

Testování nového sestavení

Pro testování Vašeho sestavení na vyžádání

  1. Spusťte aplikaci nasazenou s ClickOnce.

  2. Po zobrazení hlavního formuláře, stiskněte Button.Měli byste vidět řetězec v okně zprávy s nápisem "Hello, World!"

Viz také

Referenční dokumentace

ApplicationDeployment