几乎每个生产级应用程序都必须使用资源。 资源是使用应用逻辑部署的任何非可执行数据。 资源可能在应用中显示为错误消息或用户界面的一部分。 资源可以包含多种形式的数据,包括字符串、图像和持久化对象。 (若要将持久对象写入资源文件,这些对象必须可序列化。将数据存储在资源文件中后,无需重新编译整个应用即可更改数据。 它还使你能够将数据存储在单个位置,并且无需依赖存储在多个位置的硬编码数据。
.NET 为资源的创建和 本地化 提供全面的支持。 此外,.NET 还支持用于打包和部署本地化资源的简单模型。
创建和本地化资源
在一个非本地化的应用程序中,资源文件可以用作应用数据的存储库,特别是用于那些可能在源代码中多处硬编码的字符串。 通常,将资源创建为文本(.txt)或 XML(.resx)文件,并使用 Resgen.exe(资源文件生成器) 将它们编译为二进制 .resources 文件。 然后,语言编译器可以将这些文件嵌入到应用的可执行文件中。 有关创建资源的详细信息,请参阅 “创建资源文件”。
还可以本地化应用的资源以适应特定文化。 这使你能够生成应用的本地化(已翻译)版本。 开发使用本地化资源的应用时,您需要指定一种文化作为中立文化或回退文化。当没有合适的资源可用时,将使用这种文化的资源。 通常,中性文化的资源存储在应用程序的可执行文件中。 其余各本地化区域性的资源存储在单独的附属程序集中。 有关详细信息,请参阅 “创建卫星程序集”。
打包和部署资源
本地化的应用资源部署在附属程序集中。 卫星程序集包含单个文化的资源,并且它不包含任何应用代码。 在卫星程序集部署模型中,创建一个具有一个默认程序集(通常是主程序集)的应用程序,并为应用程序支持的每个区域性创建一个卫星程序集。 由于卫星程序集不是主程序集的一部分,因此无需替换应用的主程序集即可轻松替换或更新对应于特定文化的资源。
仔细确定哪些资源将构成应用的默认资源程序集。 由于它是主程序集的一部分,因此对它所做的任何更改都需要替换主程序集。 如果未提供默认资源,则 当资源回退进程 尝试查找它时,将引发异常。 在设计良好的应用中,使用资源绝不应引发异常。
有关详细信息,请参阅 打包和部署资源 一文。
检索资源
在运行时,应用会基于 CultureInfo.CurrentUICulture 属性指定的区域性为每个线程加载相应的本地化资源。 此属性值派生如下:
直接将表示本地化文化的CultureInfo对象分配给Thread.CurrentUICulture属性。
如果未显式分配区域性,则通过从 CultureInfo.DefaultThreadCurrentUICulture 属性检索默认线程 UI 区域性。
如果没有明确分配默认线程 UI 区域性,则在本地计算机上检索当前用户的区域性。 在 Windows 上运行的 .NET 实现通过调用 Windows
GetUserDefaultUILanguage
函数执行此作。
有关如何设置当前 UI 文化的详细信息,请参阅 CultureInfo 和 CultureInfo.CurrentUICulture 参考页面。
随后,通过使用 System.Resources.ResourceManager 类,可以为当前的 UI 区域性或特定区域性检索资源。 尽管该 ResourceManager 类最常用于检索资源,但 System.Resources 命名空间包含可用于检索资源的其他类型。 这些包括:
类 ResourceReader 可用于枚举嵌入程序集或存储在独立二进制 .resources 文件中的资源。 当不知道运行时可用的资源的精确名称时,它很有用。
类 ResXResourceReader ,使你能够从 XML (.resx) 文件检索资源。
该 ResourceSet 类使你能够检索特定文化的资源,而无需遵循回退规则。 资源可以存储在程序集或独立的二进制 .resources 文件中。 还可以开发一个 IResourceReader 实现,使你能够使用该 ResourceSet 类从其他源检索资源。
类 ResXResourceSet 使你能够将 XML 资源文件中的所有项检索到内存中。