检索附属程序集中的资源
理想情况下,您应该将默认或非特定程序集的资源与主程序集打包在一起,并且为您的应用程序支持的每一语言创建单独的附属程序集。 ResourceManager 类提供在运行时对特定于区域性的资源的访问,并通过使用资源后备进程控制应用程序检索资源的方式。 有关更多信息,请参见 打包和部署资源 主题中的“资源后备进程”子主题。 建议您通过 ResourceManager 类的构造函数之一访问资源。 这要求资源被编译成附属程序集,或者被编译成应用程序的主程序集的一部分。
ResourceManager 基于当前线程的 CultureInfo.CurrentUICulture 属性确定检索哪些资源。 例如,如果用默认的英语语言资源和分别包含法语和德语语言资源的两个附属程序集编译一个应用程序,并且 CurrentUICulture 属性被设置为“de”,则 ResourceManager 检索德语资源。 有关如何设置 CurrentUICulture 属性的更多信息,请参见使用 CurrentUICulture 属性。
下面的示例使用 ResourceManager.GetString 方法来检索并显示一个字符串资源。
…
Dim private rm As ResourceManager
rm = New ResourceManager("MyStrings", Me.GetType().Assembly)
Console.Writeline(rm.GetString("string1"))
…
…
private ResourceManager rm;
rm = new ResourceManager("MyStrings", this.GetType().Assembly);
Console.Writeline(rm.GetString("string1"));
…
此代码检索并显示 MyStrings 文件的 string1。 加载的实际字符串取决于当前线程的 CurrentUICulture 属性。
下面的示例使用 ResourceManager.GetObject 方法来检索并显示二进制资源(如图形图像)。
…
Dim private rm As ResourceManager
rm = New ResourceManager("MyImages", Me.GetType().Assembly)
PictureBox.Image = Ctype(rm.GetObject("MyObject"), System.Drawing.Image)
…
…
private ResourceManager rm;
rm = new ResourceManager("MyImages", this.GetType().Assembly);
PictureBox.Image = (System.Drawing.Image)rm.GetObject("MyObject");
…
此代码加载资源文件 MyImages 中名为 MyObject 的对象。 该代码将 MyObject 转换为 Image 类型并将该类型分配给 PictureBox 的图像属性。 加载的实际对象取决于当前线程的 CurrentUICulture 属性。
ResourceSet 类存储为单个区域性本地化的所有资源。 ResourceSet 不使用资源后备进程。 因此,ResourceSet 不如在本地化应用程序中那般有用。
附属程序集的版本控制支持
默认情况下,当 ResourceManager 检索请求的资源时,它将查找其版本号与主程序集的版本号相匹配的附属程序集。 当部署完应用程序后,最好更新主程序集或特定资源的附属程序集。 .NET Framework 提供对主程序集和附属程序集的版本控制支持。
SatelliteContractVersionAttribute 类为主程序集提供版本控制支持。 通过在应用程序的主程序集上指定 SatelliteContractVersionAttribute,您无需更新主程序集的附属程序集即可更新和重新部署主程序集。 当您更新主程序集后,可增加该主程序集的版本号,但保持附属合同版本号不变。 当 ResourceManager 检索请求的资源时,它将加载由此特性指定的附属程序集版本。
出版商策略程序集提供对附属程序集的版本控制支持。 您无需更新主程序集即可更新和重新部署附属程序集。 在您完成对附属程序集的更新后,增加附属程序集的版本号并将该版本号随出版商策略程序集一起附带。 在出版商策略程序集中,指定您的新附属程序集向后兼容于其以前的版本。 尽管 ResourceManager 将使用主程序集的现有附属合同版本号来检索请求的资源,但将检索到该程序集的正确已更新版本,因为程序集加载程序将绑定到出版商策略程序集中指定的附属程序集版本。 有关出版商策略程序集的更多信息,请参见创建发行者策略文件。
若要启用完全的程序集版本控制支持,最好在全局程序集缓存中部署带强名称的程序集并在应用程序目录中部署不带强名称的程序集。 如果要在应用程序目录中部署带强名称的程序集,则将不能在更新程序集时递增附属程序集的版本号。 相反,您必须在将现有代码替换为更新代码的地方执行就地更新并维持相同的版本号。 例如,如果要更新具有完全指定程序集名称“myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a”的附属程序集的版本 1.0.0.0,请用更新的 myApp.resources.dll 将其覆盖,该 myApp.resources.dll 已经用相同的完全指定程序集名称“myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a”进行编译。 请注意,由于版本号不能递增,在附属程序集文件上使用就地更新将使应用程序很难准确地确定附属程序集的版本。
有关程序集版本控制的更多信息,请参见程序集版本控制和运行时如何定位程序集。