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
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.
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!"); } } } }
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.
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;
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); }
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
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.
clicar no Arquivos de aplicativo botão.
Localize a listagem de ClickOnceLibrary.dll.conjunto o Status da publicar caixa suspensa de a Incluir.
expandir o agrupar lista suspensa e selecionar Novo.Digite o nome de ClickOnceLibrary sistema autônomo o nome do novo agrupar.
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)
Criar o seu ClickOnce manifestos conforme descrito em Demonstra Passo a passo: Implantando manualmente um aplicativo ClickOnce.
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.
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
Iniciar o aplicativo implantado com ClickOnce.
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!"