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
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
ClickOnceLibrary
a 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.Definire una classe denominata
DynamicClass
con una singola proprietà denominataMessage
.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.Fare clic con il pulsante destro del mouse sul modulo, scegliere Visualizza codice dal menu e aggiungere i riferimenti seguenti al modulo.
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); }
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 .
Contrassegnare gli assembly come facoltativi
Per contrassegnare gli assembly come facoltativi nell'applicazione ClickOnce mediante Visual Studio
Fare clic con il pulsante destro del mouse sul progetto Windows Forms in Esplora soluzioni e scegliere Proprietà. Selezionare la scheda Pubblica .
Fare clic sul pulsante File applicazione .
Trovare l'elenco per ClickOnceLibrary.dll. Impostare la casella di riepilogo a discesa Stato pubblicazione su Includi.
Espandere la casella di riepilogo a discesa Gruppo e selezionare Nuovo. Immettere il nome
ClickOnceLibrary
come nome del nuovo gruppo.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)
Creare i manifesti ClickOnce come descritto in Procedura dettagliata: Distribuire manualmente un'applicazione ClickOnce.
Prima di chiudere MageUI.exe, selezionare la scheda contenente il manifesto dell'applicazione di distribuzione e all'interno della scheda selezionare la scheda File .
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:
Avviare l'applicazione distribuita con ClickOnce.
Quando viene visualizzato il modulo principale, premere l'oggetto Button. Verrà visualizzata una stringa in una finestra di messaggio con il testo "Hello, World!"