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

  1. Utwórz katalog o nazwie ClickOnceOnDemand.

  2. Otwórz wiersz polecenia zestawu Windows SDK lub wiersz polecenia programu Visual Studio.

  3. Przejdź do katalogu ClickOnceOnDemand.

  4. Wygeneruj parę kluczy publicznych/prywatnych przy użyciu następującego polecenia:

    sn -k TestKey.snk
    
  5. Za pomocą Notatnik lub innego edytora tekstów zdefiniuj klasę o nazwie z jedną właściwością o nazwie DynamicClassMessage.

    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!");
                }
            }
        }
    }
    
  6. Zapisz tekst jako plik o nazwie ClickOnceLibrary.cs lub ClickOnceLibrary.vb w zależności od używanego języka w katalogu ClickOnceOnDemand.

  7. Skompiluj plik do zestawu.

    csc /target:library /keyfile:TestKey.snk ClickOnceLibrary.cs
    
  8. Aby uzyskać token klucza publicznego dla zestawu, użyj następującego polecenia:

    sn -T ClickOnceLibrary.dll
    
  9. 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);
            }
        }
    }
    
  10. W kodzie znajdź wywołanie metody LoadFile.

  11. UstawPublicKeyToken wartość pobraną wcześniej.

  12. Zapisz plik jako Form1.cs lub Form1.vb.

  13. Skompiluj go do pliku wykonywalnego przy użyciu następującego polecenia.

    csc /target:exe /reference:ClickOnceLibrary.dll Form1.cs
    

Oznacz zestawy jako opcjonalne

Aby oznaczyć zestawy jako opcjonalne w aplikacji ClickOnce przy użyciu MageUI.exe

  1. 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 ClickOnceOnDemandaplikacji 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.

  2. 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 ClickOnceOnDemandwdrożenia nazwę .

Testowanie nowego zestawu

Aby przetestować zestaw na żądanie

  1. Przekaż wdrożenie technologii ClickOnce na serwer sieci Web.

  2. 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ę ClickOnceOnDemandClickOnce 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
    
  3. Po wyświetleniu formularza głównego naciśnij klawisz Button. W oknie okna okna komunikatu powinien zostać wyświetlony ciąg z napisem "Hello, World!".