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

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

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

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

说明说明

为了测试目的,下列代码示例以编程方式将区域性设置为 ja-JP。有关如何针对生产环境调整该代码的信息,请参见本主题后面的“后续步骤”部分。

系统必备

本主题假定您了解如何使用 Visual Studio 将已本地化的资源添加到应用程序中。有关详细说明,请参见演练:本地化 Windows 窗体

将附属程序集标记为可选

  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。在部署应用程序之前,以编程的方式执行设置是测试附属程序集的一种好方法。

请参见

任务

演练:使用 ClickOnce 部署 API 按需下载附属程序集

概念

本地化 ClickOnce 应用程序