演练:使用 ClickOnce 部署 API 按需下载附属程序集
通过使用附属程序集,可以为多个区域性配置 Windows 窗体应用程序。 “附属程序集”是一种包含除应用程序默认区域性以外区域性的应用程序资源的程序集。
如 本地化 ClickOnce 应用程序中所述,可以在同一 ClickOnce 部署中包含适用于多个区域性的多个附属程序集。 默认情况下,即使单个客户端可能只需要一个附属程序集,ClickOnce 也会将部署中的所有附属程序集下载到客户端计算机中。
本演练演示如何将附属程序集标记为可选,并且只下载客户端计算机的当前区域性设置需要的程序集。 下面的过程使用 Windows 软件开发包 (SDK) 中可用的工具。 也可在 Visual Studio 中执行此任务。 有关更多信息,请参见 演练:在设计器中使用 ClickOnce 部署 API 按需下载附属程序集 和 演练:在设计器中使用 ClickOnce 部署 API 按需下载附属程序集 和 演练:在设计器中使用 ClickOnce 部署 API 按需下载附属程序集 和 演练:在设计器中使用 ClickOnce 部署 API 按需下载附属程序集.
提示
出于测试目的,下面的代码示例以编程方式将区域性设置为 ja-JP。 有关如何针对生产环境调整该代码的信息,请参见本主题后面的“后续步骤”部分。
系统必备
本主题假定您了解如何使用 Visual Studio 将已本地化的资源添加到应用程序中。 有关详细说明,请参见演练:本地化 Windows 窗体。
按需下载附属程序集
将下面的代码添加到应用程序中,以启用附属程序集的按需下载。
Imports System.Deployment.Application Imports System.Globalization Imports System.Threading Public Class Form1 Shared Sub Main(ByVal args As String()) Application.EnableVisualStyles() Thread.CurrentThread.CurrentUICulture = New CultureInfo("ja-JP") GetSatelliteAssemblies(Thread.CurrentThread.CurrentUICulture.ToString()) Application.Run(New Form1()) 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 error to the user, as there may not be a satellite ' assembly if the user's culture and the application's default culture match. End Try End If End If End Sub End Class
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. } } } } } }
使用Resgen.exe(资源文件生成器) 或 Visual Studio 为应用程序生成附属程序集。
使用 MageUI.exe 生成应用程序清单或打开现有的应用程序清单。 有关此工具的更多信息,请参见 MageUI.exe(图形化客户端中的清单生成和编辑工具)。
单击**“文件”**选项卡。
单击**“省略号”按钮(“...”**)并选择包含所有应用程序的程序集和文件的目录(包括使用 Resgen.exe 生成的附属程序集)。 (附属程序集将采用 isoCode\ApplicationName.resources.dll 形式的名称,其中,isoCode 是 RFC 1766 格式的语言标识符。)
单击**“填充”**向部署中添加文件。
选中每个附属程序集的**“可选”**复选框。
将每个附属程序集的组字段设置为其 ISO 语言标识符。 例如,对于日文附属程序集,您会指定名为 ja-JP 的下载组名称。 这将使在第 1 步中添加的代码能够根据用户的 CurrentUICulture 属性设置下载适当的附属程序集。
后续步骤
在生产环境中,由于客户端计算机具有默认设置的正确值,因此可能需要移除代码示例中将 CurrentUICulture 设置为特定值的代码行。 例如,当在日语客户端计算机上运行应用程序时,默认情况下,CurrentUICulture 将设置为 ja-JP。 以编程方式设置该值是在部署应用程序之前测试附属程序集的一种好方法。