Пошаговое руководство. Скачивание сборок по запросу с помощью API развертывания ClickOnce с помощью конструктора

По умолчанию все сборки, включенные в приложение ClickOnce, загружаются при первом запуске приложения. Однако некоторые части приложения могут быть нужны лишь небольшому числу пользователей. В этом случае рекомендуется скачивать сборку только при создании одного из ее типов. В следующем примере показано, как пометить определенные сборки в приложении как "необязательные" и скачивать их с помощью классов в пространстве имен System.Deployment.Application , когда среда CLR нуждается в них.

Примечание.

Класс ApplicationDeployment и API в System.Deployment.Application пространстве имен не поддерживаются в .NET Core и .NET 5 и более поздних версиях. В .NET 7 поддерживается новый метод доступа к свойствам развертывания приложения. Дополнительные сведения см. в разделе "Свойства развертывания Access ClickOnce" в .NET. .NET 7 не поддерживает эквивалент методов ApplicationDeployment.

Примечание.

Для выполнения данной процедуры приложение должно выполняться с полным доверием.

Примечание.

В зависимости от установок или выпуска сервера доступные диалоговые окна и команды меню могут отличаться от описанных в справке. Чтобы изменить параметры, выберите в меню Сервис пункт Импорт и экспорт параметров . Дополнительные сведения см. в разделе Сброс параметров.

Создание проектов

Создание проекта, использующего сборку по запросу с помощью Visual Studio

  1. Создайте проект Windows Forms в Visual Studio. В меню Файл выберите пункт Добавить, затем щелкните Создание проекта. Выберите проект Библиотека классов в диалоговом окне и назовите его ClickOnceLibrary.

    Примечание.

    В Visual Basic мы рекомендуем изменить свойства проекта, чтобы сменить корневое пространство имен для этого проекта на Microsoft.Samples.ClickOnceOnDemand или то, которое подходит вам. Для простоты два проекта в этом пошаговом руководстве находятся в одном пространстве имен.

  2. Определите класс DynamicClass с одним свойством 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. Выберите проект Windows Forms в обозревателе решений. Добавьте ссылку на сборку System.Deployment.Application и ссылку на проект ClickOnceLibrary .

    Примечание.

    В Visual Basic мы рекомендуем изменить свойства проекта, чтобы сменить корневое пространство имен для этого проекта на Microsoft.Samples.ClickOnceOnDemand или то, которое подходит вам. Для простоты два проекта в этом пошаговом руководстве находятся в одном пространстве имен.

  4. Щелкните форму правой кнопкой мыши, выберите Просмотреть код и добавьте следующие ссылки на форму.

    using System.Reflection;
    using System.Deployment.Application;
    using Microsoft.Samples.ClickOnceOnDemand;
    using System.Security.Permissions;
    
  5. Добавьте следующий код для скачивания этой сборки по запросу. Этот код показывает, как сопоставить набор сборок с именем группы с помощью универсального класса Dictionary . Поскольку в этом пошаговом руководстве мы скачиваем только одну сборку, в нашей группе присутствует только одна сборка. В реальном приложении рекомендуется скачать сразу все сборки, связанные с одной функцией в приложении. Таблица сопоставлений позволяет легко сделать это, связав все библиотеки DLL, относящиеся к некоторому компоненту, с именем группы скачивания.

    // 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. В меню Вид выберите пункт Область элементов. Перетащите Button с панели элементов в форму. Дважды нажмите кнопку и добавьте приведенный ниже код в обработчик событий Click .

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

Пометка сборок как необязательных

Пометка сборок как необязательных в приложении ClickOnce с помощью Visual Studio

  1. Щелкните правой кнопкой мыши проект Windows Forms в обозревателе решений и выберите пункт Свойства. Перейдите на вкладку Публикация .

  2. Нажмите кнопку Файлы приложения .

  3. Найдите описание для ClickOnceLibrary.dll. Задайте в раскрывающемся списке Состояние публикации значение Включить.

  4. Разверните раскрывающийся список Группа и выберите Создать. Введите имя ClickOnceLibrary в качестве имени новой группы.

  5. Продолжайте публикацию приложения, как описано в разделе "Практическое руководство. Публикация приложения ClickOnce с помощью мастера публикации".

Пометка сборок как необязательных в приложении ClickOnce с помощью Инструмента создания и изменения манифестов с графическим клиентом (MageUI.exe)

  1. Создайте манифесты ClickOnce, как описано в пошаговом руководстве. Вручную разверните приложение ClickOnce.

  2. Перед закрытием MageUI.exe выберите вкладку, содержащую манифест приложения развертывания и откройте на ней вкладку Файлы .

  3. Найдите ClickOnceLibrary.dll в списке файлов приложения и задайте в столбце Тип файла значение Нет. Для столбца Группа введите значение ClickOnceLibrary.dll.

Тестирование новой сборки

Тестирование сборки по запросу:

  1. Запустите приложение, развернутое с помощью ClickOnce.

  2. Когда появится основная форма, нажмите Button. В окне сообщения вы должны видеть строку "Hello, World!"