Share via


Demonstra Passo a passo: Download de assemblies sob demanda com a API usando o Designer de implantação do ClickOnce

Por padrão, todos os assemblies incluídos em um ClickOnce aplicativos são baixados quando o aplicativo é executado pela primeira vez. No entanto, pode haver partes do aplicativo são usados por um pequeno conjunto de usuários.Nesse caso, você deseja baixar um assembly somente quando você criar um de seus tipos.A seguinte explicação passo a passo demonstra sistema autônomo marcar determinados assemblies em seu aplicativo sistema autônomo "opcional", e sistema autônomo baixá-los usando classes noSystem.Deployment.Application namespace Quando o common linguagem tempo de execução requê-los.

Observação:

Seu aplicativo precisará executado em confiança total para usar este procedimento.

Observação:

As caixas de diálogo e comandos de menu demonstradas podem ser diferentes daqueles descritas na Ajuda, dependendo das configurações ativas ou configurações de edição.Para alterar as configurações, clicar Importar e exportar configurações on the Ferramentas menu.Para obter mais informações, consulte Configurações do Visual Studio.

Criação de projetos

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

  1. Crie um novo projeto Formulário do Windows no Visual Studio.No menu File, aponte para Add, e clique New Project.escolher um biblioteca de classes projeto na caixa de diálogo caixa e nomeie-ClickOnceLibrary.

    Observação:

    No Visual Basic, é recomendável 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 denominada DynamicClass com uma propriedade única chamada 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. selecionar o projeto Windows Forms em O gerenciador de soluções.Adicionar uma referência para o System.Deployment.Application referência de assembly e um projeto para o ClickOnceLibrary projeto.

    Observação:

    No Visual Basic, é recomendável que você modifique as propriedades do projeto para alterar a raiz namespace 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 espaço para nome.

  4. clicar com o botão direito do mouse no formulário, clique em Exibir código a partir do 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 um conjunto de módulos (assemblies) para um nome de agrupar usando um genérico Dictionary classe. Porque nós estiver baixando apenas um único assembly nesta explicação passo a passo, há apenas um assembly no nosso agrupar.Em um aplicativo real, provavelmente você desejaria fazer o baixar de todos os assemblies relacionados a um único recurso em seu aplicativo ao mesmo time.A tabela de mapeamento permite fazer isso com facilidade por meio da associação de todas as DLLs que pertencem a um recurso com um nome de agrupar de baixar.

    ' 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.arrastar um Button do Caixa de ferramentas para o formulário.clicar duas vezes no botão e adicione o seguinte código à 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 sistema autônomo opcional

Marcar assemblies sistema autônomo opcionais em seu aplicativo ClickOnce usando o Visual Studio

  1. clicar com o botão direito do mouse o projeto Windows Forms em O gerenciador de soluções e clique em Propriedades.selecionar o Publicar guia.

  2. clicar no Arquivos de aplicativo botão.

  3. Localize a listagem de ClickOnceLibrary.dll.conjunto o Status da publicar caixa suspensa de a Incluir.

  4. expandir o agrupar lista suspensa e selecionar Novo.Digite o nome de ClickOnceLibrary sistema autônomo o nome do novo agrupar.

  5. Continuar a publicar seu aplicativo sistema autônomo descrito em Como: publicar um aplicativo ClickOnce..

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

  1. Criar o seu ClickOnce manifestos conforme descrito em Demonstra Passo a passo: Implantando manualmente um aplicativo ClickOnce.

  2. Antes de fechar MageUI.exe, selecionar a guia que contém o manifesto do aplicativo da sua implantação e nessa guia, selecionar o Arquivos tab.

  3. Localizar ClickOnceLibrary.dll na lista de arquivos do aplicativo e defini a Tipo de arquivo coluna Nenhum.O agrupar coluna, tipo de ClickOnceLibrary.dll.

O 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 o 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