Поделиться через


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

Приложения Windows Forms можно настроить для нескольких языков и региональных параметров, воспользовавшись вспомогательными сборками. Вспомогательная сборка — это сборка, содержащая ресурсы приложения для языка, отличного от языка и региональных параметров приложения по умолчанию.

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

Это пошаговое руководство показывает, как пометить вспомогательные сборки как необязательные и загрузить только сборку, необходимую клиентскому компьютеру для текущих настроек языка и региональных параметров.

Примечание.

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

Примечание.

В целях тестирования в следующих примерах кода программным образом задается следующий язык и региональные параметры: ja-JP. В подразделе «Дальнейшие действия» далее в этом разделе приводятся сведения о том, как настроить этот код для производственной среды.

Как пометить вспомогательные сборки как необязательные

  1. Выполните сборку проекта. Это позволяет создать вспомогательные сборки для всех языков и региональных параметров, для которых выполняется локализация.

  2. Щелкните правой кнопкой мыши имя проекта в обозревателе решений и выберите Свойства.

  3. Перейдите на вкладку Опубликовать и нажмите кнопку Файлы приложения.

  4. Установите флажок Показать все файлы, чтобы отобразить вспомогательные сборки. По умолчанию все вспомогательные сборки будут включены в развертывание и будут видны в этом диалоговом окне.

    В вспомогательной сборке будет указано имя в формате <isoCode>\ApplicationName.resources.dll, где <isoCode> является идентификатором языка в формате RFC 1766.

  5. Щелкните Создать в списке Группа загрузки для каждого идентификатора языка. При появлении запроса имени группы загрузки введите идентификатор языка. Например, для японской вспомогательной сборки можно указать имя ja-JPгруппы загрузки.

  6. Закройте диалоговое окно Файлы приложения.

Загрузка вспомогательных сборок по требованию в C#

  1. Откройте файл Program.cs. Если вы не видите этот файл в обозревателе решений, выберите проект и в меню Проект щелкните Показать все файлы.

  2. Используйте следующий код для загрузки соответствующей вспомогательной сборки и запуска приложения.

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using System.Threading;
    using System.Globalization;
    using System.Deployment.Application;
    using System.Reflection;
    
    namespace ClickOnce.SatelliteAssemblies
    {
        static class Program
        {
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Thread.CurrentThread.CurrentUICulture = new CultureInfo("ja-JP");
    
                // Call this before initializing the main form, which will cause the resource manager
                // to look for the appropriate satellite assembly.
                GetSatelliteAssemblies(Thread.CurrentThread.CurrentCulture.ToString());
    
                Application.Run(new Form1());
            }
    
            static void GetSatelliteAssemblies(string groupName)
            {
                if (ApplicationDeployment.IsNetworkDeployed)
                {
                    ApplicationDeployment deploy = ApplicationDeployment.CurrentDeployment;
    
                    if (deploy.IsFirstRun)
                    {
                        try
                        {
                            deploy.DownloadFileGroup(groupName);
                        }
                        catch (DeploymentException de)
                        {
                            // Log error. Do not report this error to the user, because a satellite
                            // assembly may not exist if the user's culture and the application's
                            // default culture match.
                        }
                    }
                }
            }
    
        }
    }
    

Загрузка вспомогательных сборок по требованию в Visual Basic

  1. В окне Свойства для приложения щелкните вкладку Приложение.

  2. В нижней части вкладки нажмите кнопку Просмотреть события приложения.

  3. Добавьте следующие импорты в начало файла ApplicationEvents.VB.

    Imports System.Deployment.Application
    Imports System.Globalization
    Imports System.Threading
    
  4. Добавьте в класс MyApplication приведенный далее код.

    Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
        Thread.CurrentThread.CurrentUICulture = New CultureInfo("ja-JP")
        GetSatelliteAssemblies(Thread.CurrentThread.CurrentUICulture.ToString())
    End Sub
    
    Private Shared Sub GetSatelliteAssemblies(ByVal groupName As String)
        If (ApplicationDeployment.IsNetworkDeployed) Then
    
            Dim deploy As ApplicationDeployment = ApplicationDeployment.CurrentDeployment
    
            If (deploy.IsFirstRun) Then
                Try
                    deploy.DownloadFileGroup(groupName)
                Catch de As DeploymentException
                    ' Log error. Do not report this error to the user, because a satellite
                    ' assembly may not exist if the user's culture and the application's
                    ' default culture match.
                End Try
            End If
        End If
    End Sub
    

Следующие шаги

В продуктивной среде, скорее всего, потребуется удалить строку в примерах кода, задающую определенное значение для свойства CurrentUICulture, потому что на клиентских компьютерах правильное значение будет задаваться по умолчанию. Если приложение выполняется на клиентском компьютере с японским языком, например, свойство CurrentUICulture будет по умолчанию равно ja-JP . Программная установка этого значения — хороший способ проверить вспомогательные сборки перед развертыванием приложения.