Compartilhar via


Passo a passo: baixar assemblies sob demanda com a API de implantação do ClickOnce

Por padrão, todos os assemblies incluídos em um aplicativo ClickOnce são baixados quando o aplicativo é executado pela primeira vez. No entanto, pode haver partes do aplicativo que são usadas por um pequeno conjunto de usuários. Nesse caso, baixe um assembly somente quando você criar um de seus tipos. O passo a passo a seguir demonstra como marcar determinados assemblies em seu aplicativo como "opcionais" e como baixá-los usando classes no namespace System.Deployment.Application quando o CLR (Common Language Runtime) os exige.

Observação

A classe ApplicationDeployment e as APIs no namespace System.Deployment.Application não têm suporte no .NET Core e no .NET 5 e versões posteriores. No .NET 7, há suporte para um novo método de acesso às propriedades de implantação de aplicativos. Para obter mais informações, consulte Acessar propriedades de implantação do ClickOnce no .NET. O .NET 7 não oferece suporte ao equivalente aos métodos ApplicationDeployment.

Observação

Seu aplicativo terá que ser executado com confiança total para usar esse procedimento.

Pré-requisitos

Você precisará de um dos seguintes componentes para concluir esta instrução passo a passo:

  • O SDK do Windows. O SDK do Windows pode ser baixado do Centro de Download da Microsoft.

  • Visual Studio.

Criar os projetos

Para criar um projeto que usa um assembly sob demanda

  1. Crie um diretório chamado ClickOnceOnDemand.

  2. Abra o Prompt de Comando do SDK do Windows ou do Visual Studio.

  3. Altere para o diretório ClickOnceOnDemand.

  4. Gere um par de chaves pública/privada usando o seguinte comando:

    sn -k TestKey.snk
    
  5. Usando o Bloco de Notas ou outro editor de texto, defina uma classe chamada DynamicClass com uma propriedade chamada 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!");
                }
            }
        }
    }
    
  6. Salve o texto como um arquivo chamado ClickOnceLibrary.cs ou ClickOnceLibrary.vb, dependendo da linguagem usada, no diretório ClickOnceOnDemand.

  7. Compile o arquivo em um assembly.

    csc /target:library /keyfile:TestKey.snk ClickOnceLibrary.cs
    
  8. Para obter o token de chave pública do assembly, use o seguinte comando:

    sn -T ClickOnceLibrary.dll
    
  9. Crie um arquivo usando seu editor de texto e insira o código a seguir. Esse código cria um aplicativo do Windows Forms que baixa o assembly ClickOnceLibrary quando necessário.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Reflection;
    using System.Deployment.Application;
    using Microsoft.Samples.ClickOnceOnDemand;
    
    namespace ClickOnceOnDemand
    {
        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, Unrestricted=true)]
        public class Form1 : Form
        {
            // 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>();
    
            public static void Main()
            {
                Form1 NewForm = new Form1();
                Application.Run(NewForm);
            }
    
            public Form1()
            {
                // Configure form. 
                this.Size = new Size(500, 200);
                Button getAssemblyButton = new Button();
                getAssemblyButton.Size = new Size(130, getAssemblyButton.Size.Height);
                getAssemblyButton.Text = "Test Assembly";
                getAssemblyButton.Location = new Point(50, 50);
                this.Controls.Add(getAssemblyButton);
                getAssemblyButton.Click += new EventHandler(getAssemblyButton_Click);
    
                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," +  
                "Version=1.0.0.0, Culture=en, PublicKeyToken=03689116d3a4ae33");
                    }
                    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);
            }
    
            private void getAssemblyButton_Click(object sender, EventArgs e)
            {
                DynamicClass dc = new DynamicClass();
                MessageBox.Show("Message: " + dc.Message);
            }
        }
    }
    
  10. No código, localize a chamada para LoadFile.

  11. Defina PublicKeyToken com o valor recuperado anteriormente.

  12. Salve o arquivo como Form1.cs ou Form1.vb.

  13. Compile-o em um executável usando o comando a seguir.

    csc /target:exe /reference:ClickOnceLibrary.dll Form1.cs
    

Marcar assemblies como opcionais

Para marcar assemblies como opcionais em seu aplicativo ClickOnce usando MageUI.exe

  1. Usando MageUI.exe, crie um manifesto de aplicativo conforme descrito em Passo a passo: implantar manualmente um aplicativo ClickOnce. Use as seguintes configurações para o manifesto do aplicativo:

    • Dê ao manifesto do aplicativo o nome ClickOnceOnDemand.

    • Na página Arquivos, na linha ClickOnceLibrary.dll, defina a coluna Tipo de Arquivo como Nenhum.

    • Na página Arquivos, na linha ClickOnceLibrary.dll, digite ClickOnceLibrary.dll na coluna Grupo.

  2. Usando MageUI.exe, crie um manifesto de implantação conforme descrito em Passo a passo: implantar manualmente um aplicativo ClickOnce. Use as seguintes configurações para o manifesto de implantação:

    • Dê ao manifesto de implantação o nome ClickOnceOnDemand.

Testando o novo assembly

Para testar o assembly sob demanda

  1. Carregue sua implantação do ClickOnce em um servidor Web.

  2. Inicie o aplicativo implantado com o ClickOnce em um navegador da Web inserindo a URL no manifesto de implantação. Se você chamar o aplicativo ClickOnce ClickOnceOnDemand e carregá-lo no diretório raiz de adatum.com, a URL será semelhante a esta:

    http://www.adatum.com/ClickOnceOnDemand/ClickOnceOnDemand.application
    
  3. Quando o formulário principal for exibido, pressione o Button. Você verá uma cadeia de caracteres em uma janela de caixa de mensagem que diz: "Hello, World!"