CLR via C# 3 读书笔记(15):第2章 生成、打包、部署和管理应用程序与类型 — 2.6 语言文化 & 2.7 简单应用程序部署

语言文化

和版本号一样,程序集还将语言文化作为其标识的一部分。例如,我可能有一个专门用于德语的程序集,一个用于瑞士德语的程序集和一个用于美国英语的程序集。语言文化通过一个包含主标记和次标记的字符串来标识。

image

一般来说,如果创建的是包含代码的程序集,就没有必要指定语言文化。这是因为代码代码通常不包含任何特定的语言文化。没有指定语言文化的程序集是culture neutral的。

如果你设计的应用程序包含特定的语言文化资源,微软强烈建议你创建包含代码和应用程序默认(或后备)资源的程序集。在生成程序集时,不用指定语言文化。该程序集将被其他程序集引用,来创建和操作类型。

现在,你可以创建一个或多个只包含特定语言的单独的程序集——不包含任何代码。使用语言文化标记的程序集称为卫星程序集(satellite assembly)。它们指定了能够正确反映其中资源的语言文化。应该为支持的所有语言文化创建卫星程序集。

通常使用AL.exe创建卫星程序集,而不必使用编译器,因为卫星程序集中不应该包含代码。在使用AL.exe时,使用/c[ulture]:text开关来指定所需的语言文化,text为字符串,如en_US代表美国英语。在部署卫星程序集时,要将其放置在与语言文化的text相符的子目录中。例如,如果应用程序根目录为C:\MyApp,美国英语的卫星程序集应该在C:\MyApp\en-US子目录中。在运行时,使用System.Resources.ResourceManager类访问卫星程序集的资源。

注意,创建包含代码的卫星程序集是可能的,尽管并不提倡这么做。如果你愿意,可以使用System.Reflection.AssemblyCultureAttribute自定义特性来指定语言文化。例如:

// Set assembly's culture to Swiss German
[assembly: AssemblyCulture("de-CH")]

通常情况下,不应该创建引用卫星程序集的程序集。换句话说,一个程序集的AssemblyRef条目指向的应该都是语言文化中性(culture-neotral)的程序集。如果要访问包含在卫星程序集中的类型或成员,你应该使用反射技术。

简单应用程序部署(私有部署程序集)

本章介绍了如何创建模块以及如何将模块组合为程序集。本节介绍如何打包和部署程序集以使应用程序能够运行。

程序集并没有规定或要求特殊的打包方式。最简单的打包方式是直接拷贝所有的文件。例如,你可以将所有程序集文件放到光盘里,连同一个批处理文件安装程序一起发布给用户,该批处理文件指示将CD中的文件拷贝到用户硬盘中的某个目录里。由于程序集包含所有依赖的程序集引用和类型,用户可以运行应用程序并在运行时查找应用程序目录中被引用的程序集。无需更改注册表。卸载程序只需要删除所有文件即可。

当然,也可以使用其他机制来打包和安装程序集,如.cab文件(典型地用于互联网下载的场景,用来压缩文件以缩短下载时间)。还可以使用Windows Installer服务(MSIExec.exe)将程序集文件打包为MSI文件。使用MSI文件允许程序集在第一次加载时才被安装。这并不是MSI的新特性,它同样可以用于非托管的EXE和DLL。

注意,使用批处理文件或其他“安装软件”可以将应用程序安装到用户的计算机内。但是要想在用户桌面或开始菜单中创建快捷方式,就需要更高级的安装软件了。同样,恢复和备份应用程序或者将其迁移到另一台计算机都是很简单的事,但是不同的快捷方式都需要特殊处理。

当然,在Visual Studio中的项目属性页的Publish选项卡中,内嵌了一个发布应用程序的功能。使用Publish选项卡中的选项可以让Visual Studio生成MSI文件并将其拷贝到Web站点、FTP服务器或文件路径。MSI文件还会安装所有的必备组件,如.NET Framework、Microsoft SQL Server 2008 Express Edition。最终,应用程序通过ClickOnce技术自动检查更新并安装到用户计算机。

部署在同一目录中的程序集称为私有部署程序集(privately deployed assembly),因为这些程序集文件不能被其他应用程序共享(除非其他应用程序也部署在同一个目录中)。私有部署程序集可以被轻松地拷贝到程序的根目录中,CLR将加载并执行其中的代码,这为开发人员、最终用户和管理员都提供了极大的便利。另外,应用程序的卸载只需要删除目录中的程序集。这也同样简化了恢复和备份。

由于每个程序集中元数据来指明要加载哪些被引用的程序集,这使得这种简单的安装、移动、卸载(不必更改注册表)变为可能。此外,应用的程序集还准确地界定了每一个类型。这意味着应用程序总是保定道它生成和测试的类型中。CLR不会加载仅仅提供了一个同名类型的其他程序集。这与COM不同,COM中的类型被记录在注册表中,这使得他们可用于同一台机器中运行的任何程序。

posted @ 2010-04-13 16:32  麒麟.NET  阅读(1737)  评论(4编辑  收藏  举报