Przewodnik: pobieranie zestawów na żądanie przy użyciu interfejsu API wdrażania ClickOnce
Domyślnie wszystkie zestawy zawarte w aplikacji ClickOnce są pobierane po pierwszym uruchomieniu aplikacji. Może jednak istnieć część aplikacji, która jest używana przez niewielki zestaw użytkowników. W takim przypadku chcesz pobrać zestaw tylko podczas tworzenia jednego z jego typów. W poniższym przewodniku pokazano, jak oznaczyć niektóre zestawy w aplikacji jako "opcjonalne" i jak pobrać je przy użyciu klas w System.Deployment.Application przestrzeni nazw, gdy środowisko uruchomieniowe języka wspólnego (CLR) ich wymaga.
Uwaga
Klasy ApplicationDeployment i interfejsy API w System.Deployment.Application przestrzeni nazw nie są obsługiwane w wersjach .NET Core i .NET 5 i nowszych. W programie .NET 7 jest obsługiwana nowa metoda uzyskiwania dostępu do właściwości wdrażania aplikacji. Aby uzyskać więcej informacji, zobacz Access ClickOnce deployment properties in .NET (Uzyskiwanie dostępu do właściwości wdrożenia ClickOnce na platformie .NET). Platforma .NET 7 nie obsługuje odpowiedników metod ApplicationDeployment.
Uwaga
Aby użyć tej procedury, aplikacja będzie musiała działać w pełnym zaufaniu.
Wymagania wstępne
Do ukończenia tego przewodnika będzie potrzebny jeden z następujących składników:
Zestaw Windows SDK. Zestaw Windows SDK można pobrać z Centrum pobierania Microsoft.
Visual Studio.
Tworzenie projektów
Aby utworzyć projekt używający zestawu na żądanie
Utwórz katalog o nazwie ClickOnceOnDemand.
Otwórz wiersz polecenia zestawu Windows SDK lub wiersz polecenia programu Visual Studio.
Przejdź do katalogu ClickOnceOnDemand.
Wygeneruj parę kluczy publicznych/prywatnych przy użyciu następującego polecenia:
sn -k TestKey.snk
Za pomocą Notatnika lub innego edytora tekstów zdefiniuj klasę o nazwie
DynamicClass
z pojedynczą właściwością o nazwieMessage
.Zapisz tekst jako plik o nazwie ClickOnceLibrary.cs lub ClickOnceLibrary.vb w zależności od używanego języka w katalogu ClickOnceOnDemand.
Skompiluj plik do zestawu.
Aby uzyskać token klucza publicznego dla zestawu, użyj następującego polecenia:
sn -T ClickOnceLibrary.dll
Utwórz nowy plik przy użyciu edytora tekstów i wprowadź następujący kod. Ten kod tworzy aplikację Windows Forms, która pobiera zestaw ClickOnceLibrary, gdy jest wymagany.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Reflection; using System.Deployment.Application; using Microsoft.Samples.ClickOnceOnDemand; namespace ClickOnceOnDemand { [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, Unrestricted=true)] public class Form1 : Form { // 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>(); public static void Main() { Form1 NewForm = new Form1(); Application.Run(NewForm); } public Form1() { // Configure form. this.Size = new Size(500, 200); Button getAssemblyButton = new Button(); getAssemblyButton.Size = new Size(130, getAssemblyButton.Size.Height); getAssemblyButton.Text = "Test Assembly"; getAssemblyButton.Location = new Point(50, 50); this.Controls.Add(getAssemblyButton); getAssemblyButton.Click += new EventHandler(getAssemblyButton_Click); 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," + "Version=1.0.0.0, Culture=en, PublicKeyToken=03689116d3a4ae33"); } 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); } private void getAssemblyButton_Click(object sender, EventArgs e) { DynamicClass dc = new DynamicClass(); MessageBox.Show("Message: " + dc.Message); } } }
W kodzie znajdź wywołanie metody LoadFile.
Ustaw
PublicKeyToken
wartość pobraną wcześniej.Zapisz plik jako Form1.cs lub Form1.vb.
Skompiluj go do pliku wykonywalnego przy użyciu następującego polecenia.
Oznacz zestawy jako opcjonalne
Aby oznaczyć zestawy jako opcjonalne w aplikacji ClickOnce przy użyciu MageUI.exe
Korzystając z MageUI.exe, utwórz manifest aplikacji zgodnie z opisem w przewodniku: Ręczne wdrażanie aplikacji ClickOnce. Użyj następujących ustawień manifestu aplikacji:
Nadaj manifestowi
ClickOnceOnDemand
aplikacji nazwę .Na stronie Pliki w wierszu ClickOnceLibrary.dll ustaw kolumnę Typ pliku na Brak.
Na stronie Pliki w wierszu ClickOnceLibrary.dll wpisz
ClickOnceLibrary.dll
w kolumnie Grupa.
Korzystając z MageUI.exe, utwórz manifest wdrożenia zgodnie z opisem w przewodniku: Ręczne wdrażanie aplikacji ClickOnce. Użyj następujących ustawień manifestu wdrożenia:
- Nadaj manifestowi
ClickOnceOnDemand
wdrożenia nazwę .
- Nadaj manifestowi
Testowanie nowego zestawu
Aby przetestować zestaw na żądanie
Przekaż wdrożenie technologii ClickOnce na serwer sieci Web.
Uruchom aplikację wdrożoną za pomocą technologii ClickOnce z przeglądarki sieci Web, wprowadzając adres URL do manifestu wdrożenia. Jeśli wywołasz aplikację
ClickOnceOnDemand
ClickOnce i przekażesz ją do katalogu głównego adatum.com, adres URL będzie wyglądać następująco:http://www.adatum.com/ClickOnceOnDemand/ClickOnceOnDemand.application
Po wyświetleniu formularza głównego naciśnij Button. W oknie okna okna komunikatu powinien zostać wyświetlony ciąg z napisem "Hello, World!".