Tutorial: Descarga de ensamblados a petición con la API de implementación de ClickOnce mediante el diseñador

De forma predeterminada, todos los ensamblados incluidos en una aplicación de ClickOnce se descargan la primera vez que se ejecuta la aplicación, aunque podría haber partes de la aplicación usadas por un pequeño sector de los usuarios. En tal caso, es probable que quiera descargar un ensamblado solo cuando cree uno de sus tipos. En el siguiente tutorial se muestra cómo marcar determinados ensamblados en la aplicación como “opcionales” y cómo descargarlos usando clases en el espacio de nombres System.Deployment.Application cuando los solicita Common Language Runtime.

Nota

La clase ApplicationDeployment y las API del espacio de nombres System.Deployment.Application no se admiten en .NET Core y .NET 5 y versiones posteriores. En .NET 7 se admite un nuevo método de acceso a las propiedades de implementación de aplicaciones. Para obtener más información, consulte Acceso a las propiedades de implementación de ClickOnce en .NET. .NET 7 no admite el equivalente de los métodos ApplicationDeployment.

Nota:

La aplicación deberá ejecutarse con plena confianza para poder usar este procedimiento.

Nota

Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de los valores de configuración o de edición activos. Para cambiar la configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas . Para obtener más información, vea Restablecer la configuración.

Creación de los proyectos

Para crear un proyecto que use un ensamblado a petición con Visual Studio

  1. Cree un proyecto de Windows Forms en Visual Studio. En el menú Archivo , seleccione Agregary haga clic en Nuevo proyecto. Elija un proyecto Biblioteca de clases en el cuadro de diálogo y asígnele el nombre ClickOnceLibrary.

    Nota

    En Visual Basic, se recomienda modificar las propiedades del proyecto para cambiar el espacio de nombres raíz de este proyecto a Microsoft.Samples.ClickOnceOnDemand o al espacio de nombres que quiera. Para que resulte más sencillo, los dos proyectos de este tutorial están en el mismo espacio de nombres.

  2. Defina una clase denominada DynamicClass con una propiedad única denominada 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!");
                }
            }
        }
    }
    
  3. Seleccione el proyecto de Windows Forms en el Explorador de soluciones. Agregue una referencia al ensamblado System.Deployment.Application y una referencia de proyecto al proyecto ClickOnceLibrary .

    Nota

    En Visual Basic, se recomienda modificar las propiedades del proyecto para cambiar el espacio de nombres raíz de este proyecto a Microsoft.Samples.ClickOnceOnDemand o al espacio de nombres que quiera. Para que resulte más sencillo, los dos proyectos de este tutorial están ubicados en el mismo espacio de nombres.

  4. Haga clic con el botón derecho en el formulario, haga clic en Ver código en el menú y agregue las siguientes referencias al formulario.

    using System.Reflection;
    using System.Deployment.Application;
    using Microsoft.Samples.ClickOnceOnDemand;
    using System.Security.Permissions;
    
  5. Agregue el siguiente código para descargar este ensamblado a petición. En este código se muestra cómo asignar un conjunto de ensamblados a un nombre de grupo con una clase Dictionary genérica. Dado que en este tutorial solo vamos a descargar un ensamblado, solo hay un ensamblado en nuestro grupo. En una aplicación real, probablemente querría descargar en la aplicación todos los ensamblados relacionados con una característica al mismo tiempo. La tabla de asignación le permite hacer esto fácilmente asociando todos los archivos DLL de una característica con un nombre de grupo de descarga.

    // 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. En el menú Ver , haga clic en Cuadro de herramientas. Arrastre un Button del Cuadro de herramientas al formulario. Haga doble clic en el botón y agregue el siguiente código al controlador de eventos Click .

    private void getAssemblyButton_Click(object sender, EventArgs e)
    {
        DynamicClass dc = new DynamicClass();
        MessageBox.Show("Message: " + dc.Message);
    }
    

Marcar ensamblados como opcionales

Para marcar ensamblados como opcionales en la aplicación ClickOnce con Visual Studio

  1. Haga clic con el botón derecho en el proyecto de Windows Forms en el Explorador de soluciones y haga clic en Propiedades. Seleccione la pestaña Publicar .

  2. Haga clic en el botón Archivos de aplicación .

  3. Busque la lista de ClickOnceLibrary.dll. Establezca el cuadro desplegable Estado de publicación en Incluir.

  4. Expanda el cuadro desplegable Grupo y seleccione Nuevo. Escriba el nombre ClickOnceLibrary como nuevo nombre del grupo.

  5. Siga publicando la aplicación tal y como se describe en Cómo: Publicar una aplicación ClickOnce mediante el Asistente para publicación.

Para marcar ensamblados como opcionales en la aplicación ClickOnce con la Herramienta de generación y edición de manifiestos: cliente gráfico (MageUI.exe)

  1. Cree los manifiestos de ClickOnce tal y como se describe en Tutorial: Implementación manual de una aplicación ClickOnce.

  2. Antes de cerrar MageUI.exe, seleccione la pestaña que contiene el manifiesto de aplicación de su implementación y, en esa pestaña, seleccione la pestaña Archivos .

  3. Busque ClickOnceLibrary.dll en la lista de archivos de la aplicación y establezca la columna Tipo de archivo en Ninguno. En la columna Grupo , escriba ClickOnceLibrary.dll.

Probar el nuevo ensamblado

Para probar el ensamblado a petición:

  1. Inicie la aplicación implementada con ClickOnce.

  2. Cuando aparezca el formulario principal, pulse el Button. Debería ver una cadena en una ventana de cuadro de mensaje que dice “Hello, World!”.