Przewodnik: pobieranie zestawów na żądanie przy użyciu interfejsu API wdrażania ClickOnce przy użyciu Projektant

Domyślnie wszystkie zestawy zawarte w aplikacji ClickOnce są pobierane po pierwszym uruchomieniu aplikacji. Mogą jednak istnieć części aplikacji, które są używane 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 wymaga ich.

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.

Uwaga

Okna dialogowe i polecenia menu mogą się różnić od tych opisanych w Pomocy, w zależności od ustawień aktywnych lub wydania. Aby zmienić ustawienia, kliknij pozycję Importuj i eksportuj Ustawienia w menu Narzędzia. Aby uzyskać więcej informacji, zobacz Resetowanie ustawień.

Tworzenie projektów

Aby utworzyć projekt używający zestawu na żądanie w programie Visual Studio

  1. Utwórz nowy projekt Windows Forms w programie Visual Studio. W menu Plik wskaż polecenie Dodaj, a następnie kliknij pozycję Nowy projekt. Wybierz projekt Biblioteka klas w oknie dialogowym i nadaj mu ClickOnceLibrarynazwę .

    Uwaga

    W języku Visual Basic zalecamy zmodyfikowanie właściwości projektu w celu zmiany głównej przestrzeni nazw dla tego projektu na Microsoft.Samples.ClickOnceOnDemand lub do wybranej przestrzeni nazw. Dla uproszczenia dwa projekty w tym przewodniku znajdują się w tej samej przestrzeni nazw.

  2. Zdefiniuj klasę o nazwie DynamicClass z jedną właściwością o nazwie 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. Wybierz projekt Windows Forms w Eksplorator rozwiązań. Dodaj odwołanie do System.Deployment.Application zestawu i odwołanie ClickOnceLibrary do projektu.

    Uwaga

    W języku Visual Basic zalecamy zmodyfikowanie właściwości projektu w celu zmiany głównej przestrzeni nazw dla tego projektu na Microsoft.Samples.ClickOnceOnDemand lub do wybranej przestrzeni nazw. Dla uproszczenia dwa projekty w tym przewodniku znajdują się w tej samej przestrzeni nazw.

  4. Kliknij prawym przyciskiem myszy formularz, kliknij pozycję Wyświetl kod z menu i dodaj następujące odwołania do formularza.

    using System.Reflection;
    using System.Deployment.Application;
    using Microsoft.Samples.ClickOnceOnDemand;
    using System.Security.Permissions;
    
  5. Dodaj następujący kod, aby pobrać ten zestaw na żądanie. Ten kod przedstawia sposób mapowania zestawu zestawów na nazwę grupy przy użyciu klasy ogólnej Dictionary . Ponieważ pobieramy tylko jeden zestaw w tym przewodniku, istnieje tylko jeden zestaw w naszej grupie. W rzeczywistej aplikacji prawdopodobnie chcesz pobrać wszystkie zestawy związane z jedną funkcją w aplikacji w tym samym czasie. Tabela mapowania umożliwia łatwe wykonanie tej czynności przez skojarzenie wszystkich bibliotek DLL należących do funkcji z nazwą grupy pobierania.

    // 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. W menu Widok kliknij pozycję Przybornik. Przeciągnij element Button z przybornika na formularz. Kliknij dwukrotnie przycisk i dodaj następujący kod do procedury obsługi zdarzeń Click .

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

Oznacz zestawy jako opcjonalne

Aby oznaczyć zestawy jako opcjonalne w aplikacji ClickOnce przy użyciu programu Visual Studio

  1. Kliknij prawym przyciskiem myszy projekt Windows Forms w Eksplorator rozwiązań i kliknij polecenie Właściwości. Wybierz kartę Publikuj .

  2. Kliknij przycisk Pliki aplikacji.

  3. Znajdź listę ClickOnceLibrary.dll. Ustaw pole listy rozwijanej Stan publikowania na Uwzględnij.

  4. Rozwiń pole listy rozwijanej Grupa i wybierz pozycję Nowy. Wprowadź nazwę ClickOnceLibrary jako nową nazwę grupy.

  5. Kontynuuj publikowanie aplikacji zgodnie z opisem w temacie Instrukcje: publikowanie aplikacji ClickOnce przy użyciu Kreatora publikowania.

Aby oznaczyć zestawy jako opcjonalne w aplikacji ClickOnce przy użyciu Narzędzie tworzenia i edycji manifestów — klienta graficznego (MageUI.exe)

  1. Utwórz manifesty technologii ClickOnce zgodnie z opisem w przewodniku: ręcznie wdróż aplikację ClickOnce.

  2. Przed zamknięciem MageUI.exe wybierz kartę zawierającą manifest aplikacji wdrożenia, a następnie na tej karcie wybierz kartę Pliki .

  3. Znajdź ClickOnceLibrary.dll na liście plików aplikacji i ustaw jej kolumnę Typ pliku na Wartość Brak. W kolumnie Grupa wpisz ClickOnceLibrary.dll.

Testowanie nowego zestawu

Aby przetestować zestaw na żądanie:

  1. Uruchom aplikację wdrożoną za pomocą technologii ClickOnce.

  2. Po wyświetleniu formularza głównego naciśnij klawisz Button. Powinien zostać wyświetlony ciąg w oknie pola komunikatu z napisem "Hello, World!"