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

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

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

本演练演示如何将附属程序集标记为可选,并且只下载客户端计算机的当前区域性设置需要的程序集。 以下过程使用 Windows 软件开发工具包 (SDK) 中提供的工具。 你也可以在 Visual Studio 中执行此任务。 另请参阅演练:在设计器中使用 ClickOnce 部署 API 按需下载附属程序集演练:在设计器中使用 ClickOnce 部署 API 按需下载附属程序集

注意

.NET Core 和 .NET 5 及更高版本中不支持 System.Deployment.Application 命名空间中的 ApplicationDeployment 类和 API。 在 .NET 7 中,支持一种访问应用程序部署属性的新方法。 有关详细信息,请参阅访问 .NET 中的 ClickOnce 部署属性。 .NET 7 不支持等效的 ApplicationDeployment 方法。

注意

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

先决条件

本主题假定你知道如何使用 Visual Studio 将本地化的资源添加到应用程序。 有关详细说明,请参阅演练:本地化 Windows 窗体

按需下载附属程序集

  1. 将以下代码添加到应用程序以启用按需下载附属程序集。

    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 error to the user, as there may not be a satellite
                            // assembly if the user's culture and the application's default culture match.
                        }
                    }
                }
            }
    
        }
    }
    
  2. 使用 Resgen.exe(资源文件生成器)或 Visual Studio 为应用程序生成附属程序集。

  3. 使用 MageUI.exe 生成应用程序清单,或打开现有的应用程序清单。 有关此工具的详细信息,请参阅MageUI.exe(图形化客户端中的清单生成和编辑工具)

  4. 单击“文件” 选项卡。

  5. 单击“省略号”按钮 (...),然后选择包含所有应用程序的程序集和文件(包括使用 Resgen.exe 生成的附属程序集)的目录。 (附属程序集将包含一个名称,形式为 <isoCode>\ApplicationName.resources.dll,其中 isoCode 是 RFC 1766 格式的语言标识符。<>)

  6. 单击“填充” 将文件添加到部署。

  7. 选择每个附属程序集的“可选” 复选框。

  8. 将每个附属程序集的组字段设置为它的 ISO 语言标识符。 例如,对于日语附属程序集,可以指定 ja-JP中可用的工具。 这将使在步骤 1 添加的代码能够下载适当的附属程序集,这取决于用户的 CurrentUICulture 属性设置。

后续步骤

在生产环境中,可能需要删除将 CurrentUICulture 设置为特定值的代码示例中的行,因为客户端计算机将以默认方式设置正确值。 例如,当在日语客户端计算机上运行应用程序时,默认情况下, CurrentUICulture 将设置为 ja-JP 。 以编程方式设置此值是在部署应用程序之前测试附属程序集的一个很好的方法。