Compartilhar via


Walkthrough: Fazer o download de Assemblies por demanda com a API usando o Designer de implantação de ClickOnce

Por padrão, todos os assemblies incluídos em um ClickOnce aplicativo são baixados quando o aplicativo é executar primeiro. No entanto, pode haver partes do aplicativo que são usados por um pequeno conjunto de usuários. Nesse caso, você deseja fazer o download de um assembly somente quando você cria um de seus tipos. A instrução a seguir demonstra como marcar determinados assemblies em seu aplicativo como "opcional", e como baixá-los usando classes de System.Deployment.Application namespace quando o common language runtime os requer.

ObservaçãoObservação

Será necessário que seu aplicativo executado em confiança total para usar este procedimento.

ObservaçãoObservação

As caixas de diálogo e comandos de menu demonstradas podem ser diferentes daqueles descritos na Ajuda, dependendo das configurações ativas ou configurações de edição. Para alterar suas configurações, escolha Importar e Exportar Configurações no menu Ferramentas. Para obter mais informações, consulte Trabalhando com configurações.

A criação de projetos

Para criar um projeto que usa um assembly sob demanda com Visual Studio

  1. Crie um novo projeto Formulário do Windows no Visual Studio. Sobre o arquivo , aponte para Adde, em seguida, clique em Novo projeto. Escolha um Biblioteca de classe na caixa de diálogo de projeto e denomine- ClickOnceLibrary.

    ObservaçãoObservação

    Visual Basic, recomendamos que você modifique as propriedades do projeto para alterar o namespace raiz para este projeto para Microsoft.Samples.ClickOnceOnDemand ou para um namespace de sua escolha. Para simplificar, os dois projetos nesta explicação passo a passo estão no mesmo namespace.

  2. Definir uma classe chamada DynamicClass com uma única propriedade denominada 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. Selecione o projeto Windows Forms em Solution Explorer. Adicionar uma referência para o System.Deployment.Application assembly e um projeto de referência para o ClickOnceLibrary project.

    ObservaçãoObservação

    Visual Basic, recomendamos que você modifique as propriedades do projeto para alterar o namespace raiz para este projeto para Microsoft.Samples.ClickOnceOnDemand ou para um namespace de sua escolha. Para simplificar, os dois projetos nesta explicação passo a passo estão localizados no mesmo namespace.

  4. Clique com o botão direito do formulário, clique em Exibir código no menu e adicione as seguintes referências ao formulário.

    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. Adicione o código a seguir para baixar este assembly sob demanda. Este código mostra como mapear a um conjunto de módulos (assemblies) para um nome de grupo usando um genérico Dictionary classe. Porque estamos apenas estiver fazendo o download de um único assembly nesta explicação, há apenas um assembly em nosso grupo. Em um aplicativo real, provavelmente você desejaria fazer o download de todos os assemblies relacionados a um único recurso em seu aplicativo ao mesmo tempo. A tabela de mapeamento permite fazer isso facilmente, associando as DLLs que pertencem a um recurso com um nome de grupo de download.

    ' 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. No menu Exibir, clique em Caixa de Ferramentas. Arraste um Button da caixa de ferramentas para o formulário. Clique duas vezes no botão e adicione o seguinte código para o Click manipulador de eventos.

    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);
    }
    

Marcar Assemblies como opcionais

Para marcar assemblies como opcionais em seu aplicativo de ClickOnce usando Visual Studio

  1. Clique com o botão direito no projeto de Windows Forms na Solution Explorer e clique em Propriedades. Selecione o Publicar guia.

  2. Clique o Arquivos de aplicativo botão.

  3. Localize a listagem de ClickOnceLibrary.dll. Definir o Status da publicação a caixa suspensa para incluir.

  4. Expanda o grupo caixa suspensa e selecione nova. Digite o nome ClickOnceLibrary como o novo nome de grupo.

  5. Continuar a publicar o seu aplicativo, conforme descrito em How to: Publicar um aplicativo de ClickOnce usando o Assistente de Publicação.

Para marcar assemblies como opcionais em seu aplicativo de ClickOnce usando a ferramenta de edição e geração de manifesto — cliente gráfico (MageUI.exe)

  1. Criar seu ClickOnce manifesta conforme descrito em Walkthrough: Manualmente, implantando um aplicativo de ClickOnce.

  2. Antes de fechar o MageUI.exe, selecione a guia que contém o manifesto da implantação de aplicativo e nessa guia, selecione o arquivos guia.

  3. Encontrar ClickOnceLibrary.dll na lista de arquivos do aplicativo e defina sua O tipo de arquivo coluna para Nenhum. Para o grupo coluna, tipo de ClickOnceLibrary.dll.

Novo conjunto de teste.

Para testar seu assembly sob demanda

  1. Iniciar o aplicativo implantado com ClickOnce.

  2. Quando o formulário principal for exibida, pressione a Button. Você deve ver uma seqüência de caracteres em uma janela de caixa de mensagem que diz, "Hello, World!"

Consulte também

Referência

ApplicationDeployment