演练:在设计器中使用 ClickOnce 部署 API 按需下载附属程序集

通过使用附属程序集,可以为多个区域性配置 Windows 窗体应用程序。 附属程序集 是一种包含除应用程序默认区域性以外区域性的应用程序资源的程序集。

本地化 ClickOnce 应用程序中所述,可以在同一个 ClickOnce 部署中包含适用于多个区域性的多个附属程序集。 默认情况下,即使单个客户端可能只需要一个附属程序集,ClickOnce 也会将部署中的所有附属程序集下载到客户端计算机中。

本演练演示如何将附属程序集标记为可选,并且只下载客户端计算机的当前区域性设置需要的程序集。

注意

.NET Core 和 .NET 5 及更高版本中不支持 System.Deployment.Application 命名空间中的 ApplicationDeployment 类和 API。 在 .NET 7 中,支持一种访问应用程序部署属性的新方法。 有关详细信息,请参阅访问 .NET 中的 ClickOnce 部署属性。 .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 。 在部署应用程序之前,以编程的方式执行设置是测试附属程序集的一种好方法。