1.1.1    使用资源文件

在基于.NET Compact Framework的应用程序中,可以使用资源文件将资源嵌入到程序集。使用资源文件的一个主要好处是可以将应用程序或类库DLL文件中的所有特定于语言和区域设置的元素(如标题和用户消息等)从应用程序代码中分离出来。为此,开发人员需要为所支持的每种语言创建单独的资源文件。资源文件实际是一个基于XML数据格式的文本文件,其扩展名为.resx。清单25-3显示了从资源文件中节选的一部分内容。

 

清单25-3:资源文件中的部分内容

<root>         
        <data name="MainFormCaption">         
                <value>CRM System</value>         
        </data>         
        <data name="UserWelcome">         
                <value>Hi, How are you!</value>         
        </data>         
        <data name="ErrorMessage1">         
                <value>Oh no, Something went wrong!</value>         
        </data>         
</root>

 

此时扩展名为.resx的资源文件使用起来仍然不够方便,为此Visual Studio 2005支持使用基于.NET Compact Framework的资源文件生成器(ResGen.exe)将资源文件编译成二进制的映像文件。编译后的资源文件通常具有.resources扩展名。例如,开发人员可以创建一个名为Demo.resx的资源文件,然后在.NET Framework SDK的SDK命令提示下执行以下命令,将该资源文件编译成名为Demo.resources的二进制映像文件:

 

resgen Demo.resx Demo.resources




 

将基于文本的.resx文件编译成二进制.resource文件后,为了能够在代码中直接引用该资源文件中的资源,还必须将该映像文件进一步编译为能够直接通过代码引用的.NET程序集。为此Visual Studio 2005支持使用一个名为程序集链接器 (AL.exe) 的.NET工具来完成映像文件到.NET程序集的编译。例如,要将之前生成的Demo.resources映像文件编译为.NET程序集,可在.NET Framework SDK的SDK命令提示下执行以下指令:

 

al /t:library /out:Demo.resources.dll /link:Demo.resources


 

上述命令执行成功后,将在映像文件所在目录下生成一个程序集DLL文件。将资源文件最终编译为.NET程序集后,便可以通过System.Resources命名空间中的ResourceManager类访问资源文件中定义的资源。下面演示使用ResourceManager类访问字符串资源的简单示例代码:

 

Dim asm As Assembly = Assembly.Load("Demo.resources")         
Dim rm As New System.Resources.ResourceManager("Demo", asm)         
Dim caption As String = rm.GetString("WelcomeCaption")


 

在上面这个示例中,使用ResourceManager类实例的GetString访问获取字符串资源。对于资源文件中定义的图像和其它类型的文件资源,还可以使用GetObject方法获取资源数据流,然后将数据流转换成可正常编程访问的实例对象。

除了使用ResourceManager类访问资源之外,还可以通过ResGen.exe生成一个强类型资源类,将可访问资源以类成员属性的形式对外公开。例如,要将之前创建的Demo.resx资源文件生成Visual Basic .NET可访问的强类型资源类,可在调用ResGen.exe命令时将/str参数和"vb"值添加到命令行:

 

resgen Demo.resx Demo.resources /str:vb


 

该命令行指令将生成一个名为Demo.vb的Visual Basic类定义的源文件。该源文件包含一个名为Demo的类。在该类中,存在通过ResourceManager实现强类型化属性的代码,如以下代码框所示,在生成的Demo类中定义了一个字符串类型的WelcomeCaption属性:

 

Friend Class Demo         
……         
'''<summary>         
'''  查找类似 You are Welcome! 的本地化字符串。        
'''</summary>         
Shared ReadOnly Property WelcomeCaption() As String         
Get         
Return ResourceManager.GetString("WelcomeCaption", resourceCulture)         
End Get         
End Property         
End Class


 


以上简要介绍了如何将资源文件编译为程序集,以及如何使用 ResourceManager 类和强类型资源类来访问这些资源文件。