Instruções passo a passo: baixando assemblies por demanda com a API de implantação do ClickOnce usando o designer
Por padrão, todos os assemblies incluídos em um ClickOnce aplicativo são baixados quando o aplicativo é executado pela primeira vez. 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.
Dica
Seu aplicativo terá executado em confiança total para usar este procedimento.
Dica
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 Personalizando configurações de desenvolvimento no Visual Studio.
Criação de projetos
Para criar um projeto que usa um assembly sob demanda com Visual Studio
Crie um novo projeto Formulário do Windows no Visual Studio. No menu File, aponte para Add, e clique New Project. Escolha um Biblioteca de classe de projeto na caixa de diálogo e o nome de ClickOnceLibrary.
Dica
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 espaço para nome de sua escolha.Para simplificar, os dois projetos nesta explicação passo a passo estão no mesmo namespace.
Definir uma classe chamada 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!"); } } } }
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.
Dica
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 espaço para nome de sua escolha.Para simplificar, os dois projetos nesta explicação passo a passo estão localizados no mesmo namespace.
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;
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 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 que você faça isso facilmente por meio da associação todas 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); }
No menu Exibir, clique em Caixa de Ferramentas. Arrastar um Button partir do 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); }
Marcando os Assemblies como opcional
Marcar assemblies como opcionais em seu aplicativo de ClickOnce usando Visual Studio
Clique com o botão direito no projeto do Windows Forms na Solution Explorer e clique em Propriedades. Selecione o Publicar guia.
Clique no Arquivos de aplicativo botão.
Localize a listagem de ClickOnceLibrary.dll. Definir o Status da publicação caixa drop-down para Include.
Expanda o grupo caixa suspensa e selecione New. Digite o nome ClickOnceLibrary como o novo nome de grupo.
Continuar a publicar seu aplicativo, conforme descrito em Como publicar um aplicativo ClickOnce usando o Assistente de Publicação.
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)
Criar seu ClickOnce manifesta conforme descrito em Instruções passo a passo: implantando um aplicativo ClickOnce manualmente.
Antes de fechar o MageUI.exe, selecione a guia que contém o manifesto do aplicativo da sua implantação e nessa guia, selecione o arquivos guia.
Encontrar ClickOnceLibrary.dll na lista de arquivos do aplicativo e defina seu Tipo de arquivo coluna para Nenhum. Para o grupo coluna, tipo de ClickOnceLibrary.dll.
Novo conjunto de teste.
Para testar seu assembly sob demanda
Iniciar o aplicativo implantado com ClickOnce.
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!"