Procedura dettagliata: Scaricare assembly su richiesta con l'API di distribuzione ClickOnce usando la finestra di progettazione

Per impostazione predefinita, tutti gli assembly inclusi in un'applicazione ClickOnce vengono scaricati quando l'applicazione viene eseguita per la prima volta. Alcune parti dell'applicazione possono tuttavia essere usate da un set limitato di utenti. In questo caso, è consigliabile scaricare un assembly solo quando si crea uno dei relativi tipi. La procedura dettagliata riportata di seguito illustra come contrassegnare come "facoltativi" determinati assembly nell'applicazione e come scaricarli tramite le classi nello spazio dei nomi System.Deployment.Application quando sono richiesti da Common Language Runtime.

Nota

La ApplicationDeployment classe e le API nello System.Deployment.Application spazio dei nomi non sono supportate in .NET Core e .NET 5 e versioni successive. In .NET 7 è supportato un nuovo metodo di accesso alle proprietà di distribuzione dell'applicazione. Per altre informazioni, vedere Accedere alle proprietà di distribuzione ClickOnce in .NET. .NET 7 non supporta l'equivalente dei metodi ApplicationDeployment.

Nota

Per usare questa procedura, è necessario eseguire l'applicazione con attendibilità totale.

Nota

È possibile che le finestre di dialogo e i comandi di menu visualizzati varino da quelli descritti nella Guida a seconda delle impostazioni attive o dell'edizione del programma. Per modificare le impostazioni, scegliere Importa/Esporta impostazioni dal menu Strumenti . Per altre informazioni vedere Reimpostare le impostazioni.

Creare i progetti

Per creare un progetto che usa un assembly su richiesta con Visual Studio

  1. Creare un nuovo progetto Windows Form in Visual Studio. Scegliere Aggiungi dal menu File e quindi fare clic su Nuovo progetto. Scegliere un progetto Libreria di classi nella finestra di dialogo e assegnare il nome ClickOnceLibrarya tale progetto.

    Nota

    In Visual Basic è consigliabile modificare le proprietà del progetto per cambiare lo spazio dei nomi radice per questo progetto in Microsoft.Samples.ClickOnceOnDemand o in uno spazio dei nomi selezionato. Per semplicità, i due progetti in questa procedura dettagliata si trovano nello stesso spazio dei nomi.

  2. Definire una classe denominata DynamicClass con una singola proprietà denominata 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. Selezionare il progetto Windows Forms in Esplora soluzioni. Aggiungere un riferimento all'assembly System.Deployment.Application e un riferimento al progetto ClickOnceLibrary .

    Nota

    In Visual Basic è consigliabile modificare le proprietà del progetto per cambiare lo spazio dei nomi radice per questo progetto in Microsoft.Samples.ClickOnceOnDemand o in uno spazio dei nomi selezionato. Per semplicità, i due progetti in questa procedura dettagliata si trovano nello stesso spazio dei nomi.

  4. Fare clic con il pulsante destro del mouse sul modulo, scegliere Visualizza codice dal menu e aggiungere i riferimenti seguenti al modulo.

    using System.Reflection;
    using System.Deployment.Application;
    using Microsoft.Samples.ClickOnceOnDemand;
    using System.Security.Permissions;
    
  5. Aggiungere il codice seguente per scaricare l'assembly su richiesta. Questo codice illustra come eseguire il mapping di un set di assembly in un nome di gruppo che usa una classe Dictionary generica. In questa procedura dettagliata viene scaricato un singolo assembly, pertanto è presente un solo assembly nel gruppo. In un'applicazione reale è in genere consigliabile scaricare contemporaneamente tutti gli assembly relativi a una singola funzionalità dell'applicazione. La tabella di mapping consente di eseguire facilmente questa operazione associando tutte le DLL che appartengono a una funzionalità al nome di un gruppo di 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. 
    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. Scegliere Casella degli strumenti dal menu Visualizza. Trascinare un elemento Button dalla Casella degli strumenti nel modulo. Fare doppio clic sul pulsante e aggiungere il codice seguente al gestore dell'evento Click .

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

Contrassegnare gli assembly come facoltativi

Per contrassegnare gli assembly come facoltativi nell'applicazione ClickOnce mediante Visual Studio

  1. Fare clic con il pulsante destro del mouse sul progetto Windows Forms in Esplora soluzioni e scegliere Proprietà. Selezionare la scheda Pubblica .

  2. Fare clic sul pulsante File applicazione .

  3. Trovare l'elenco per ClickOnceLibrary.dll. Impostare la casella di riepilogo a discesa Stato pubblicazione su Includi.

  4. Espandere la casella di riepilogo a discesa Gruppo e selezionare Nuovo. Immettere il nome ClickOnceLibrary come nome del nuovo gruppo.

  5. Continuare a pubblicare l'applicazione come descritto in Procedura: Pubblicare un'applicazione ClickOnce usando la Pubblicazione guidata.

Per contrassegnare gli assembly come facoltativi nell'applicazione ClickOnce mediante lo Strumento per la generazione e la modifica di manifesti - Client grafico (MageUI.exe)

  1. Creare i manifesti ClickOnce come descritto in Procedura dettagliata: Distribuire manualmente un'applicazione ClickOnce.

  2. Prima di chiudere MageUI.exe, selezionare la scheda contenente il manifesto dell'applicazione di distribuzione e all'interno della scheda selezionare la scheda File .

  3. Trovare ClickOnceLibrary.dll nell'elenco dei file dell'applicazione e impostare la relativa colonna Tipo di file su Nessuno. Per la colonna Gruppo digitare ClickOnceLibrary.dll.

Testare il nuovo assembly

Per testare l'assembly su richiesta:

  1. Avviare l'applicazione distribuita con ClickOnce.

  2. Quando viene visualizzato il modulo principale, premere l'oggetto Button. Verrà visualizzata una stringa in una finestra di messaggio con il testo "Hello, World!"