.NET 应用中的资源

几乎每一个生产性应用都需要使用资源。 资源是随应用以逻辑方式部署的任何不可执行的数据。 资源可以在应用中作为错误消息显示,或者作为用户界面的一部分显示。 资源可以包含多种形式的数据,包括字符串、图像和持久的对象。 (持久化对象必须是可序列化的,才能将这些对象写入到资源文件。)通过在资源文件中存储数据,可以更改这些数据,而无需重新编译整个应用。 还可以将数据存储在一个位置,而无需依赖存储在多个位置的硬编码数据。

.NET 为资源的创建和本地化提供全面的支持。 此外,.NET 还支持一种用于打包和部署本地化资源的简单模型。

创建和本地化资源

在非本地化的应用中,可以使用资源文件作为应用数据的存储库,特别用于存储本来可能在源代码中的多个位置为硬编码的字符串。 通常以文本 (.txt) 或 XML (.resx) 文件形式创建资源,并使用 Resgen.exe(资源文件生成器)将其编译为二进制 .resources 文件。 随后,这些文件可由语言编译器嵌入到应用的可执行文件中。 有关创建资源的详细信息,请参阅创建资源文件

您还可以按特定的区域性对应用的资源进行本地化。 这样可以生成应用的本地化(翻译)版本。 在开发使用本地化资源的应用时,可以指定一个区域性作为非特定或回退区域性,以在没有合适的资源可用时使用该区域性的资源。 通常,非特定区域性的资源存储在应用的可执行文件中。 其余各本地化区域性的资源存储在单独的附属程序集中。 有关详细信息,请参阅创建附属程序集

打包和部署资源

本地化的应用资源部署在附属程序集中。 附属程序集包含单个区域性的资源;它不包含任何应用代码。 在附属程序集部署模型中,所创建的应用包含一个默认程序集(通常是主程序集),对于该应用支持的每种区域性,还包含一个附属程序集。 因为附属程序集不是主程序集的一部分,所以您不必替换该应用的主程序集,即可很容易地替换或更新与特定区域性相对应的资源。

在确定哪些资源将构成应用的默认资源程序集时要谨慎。 因为默认资源程序集是主程序集的一部分,所以对它做任何更改都会要求你替换主程序集。 如果没有提供默认资源,则在资源回退进程尝试查找默认资源时会引发异常。 在设计良好的应用中,使用资源应永远不会引发异常。

有关详细信息,请参阅打包和部署资源一文。

检索资源

在运行时,应用会基于 CultureInfo.CurrentUICulture 属性指定的区域性为每个线程加载相应的本地化资源。 此属性的值按如下方式派生:

有关如何设置当前 UI 区域性的详细信息,请参阅 CultureInfoCultureInfo.CurrentUICulture 参考页。

随后,通过使用 System.Resources.ResourceManager 类,可以为当前的 UI 区域性或特定区域性检索资源。 虽然 ResourceManager 类最常用于检索资源,但 System.Resources 命名空间包含可用于检索资源的其他类型。 这些方法包括:

  • ResourceReader 类 - 可用于枚举嵌入在程序集或存储于独立二进制 .resources 文件中的资源。 当您不知道运行时可用资源的准确名称时,这将会很有用。

  • ResXResourceReader 类 - 可用于从 XML (.resx) 文件中检索资源。

  • ResourceSet 类 - 可用于检索特定区域性的资源,而不遵循回退规则。 资源可以存储在程序集或独立的二进制 .resources 文件中。 您还可以开发 IResourceReader 实现以使用 ResourceSet 类从某个其他源中检索资源。

  • ResXResourceSet 类 - 可用于将 XML 资源文件中的所有项目都检索到内存中。

请参阅