资源文件的定义是什么?
简单点的说法就是程序中可以使用的数据,象:字符串,图片或二进制数据等等,实际上可以包含任何类型的文件。
资源文件可以有多个语言版本,这样在开发全球化应用程序时就很重要。这个特性是通过System.Resources空间下的ResourceManager类来完成需要在什么时候调用那个版本的。在VS.NET中将一个文件的属性设置为Embedded Resource就可以使资源被嵌入到Assembly中了。
资源文件包含那几种类型?
System.Resources 空间支持三种资源文件:
.txt 文件,只能有字符串资源。因为不能被嵌入到 Assembly 中,所以很容易暴露,被客户修改。最大缺点是仅支持字符串资源,所以不推荐使用。resx 文件,由 XML 组成,可以加入任何资源,包括二进制。同样不能被嵌入到Assembly 中。在 System.Resources 名字空间中有专用读写的类。VS.NET 创建这种文件然后将其转成 .resources 文件并根据设置将其嵌入到 Assembly 中。.resources 文件,PE格式,可以加入任何资源。唯一可以被嵌入到 Assembly 的文件,在 System.Resources 名字空间中有专用读写的类。
怎么调用资源文件?
通常的做法是要将.txt 文件.resx 文件等转化成.resources 文件在通过ResourceManager来进行调用,但是我们也可以不采用那种方式,我觉得比较麻烦,象下面这样做我觉得好些:
我们可以不通过一个资源文件而直接将一资源嵌入到 Assembly 中。这可以在 VS.NET 中通过设置一文件的 Build 属性为 Embedded Resource 实现。在这种情况下 ResourceManager 就没有用了,因为它只能获取 .resources 资源文件。那么怎么调用这类的资源呢?我们需要利用一些 Reflection 中的特征。我们只要了解一些 System.Reflection.Assembly 这个类中的一些函数就可以了。有三个相关函数,不过我们只需要 Assembly.GetManifestResourceStream 这个函数。这个函数将一嵌入到Assembly 中的资源以 stream 的方式返回,而我们可以将这个 stream 转成在 .NET 中可用的对象。比如,如果嵌入资源是一图片,那么我们可以利用 New Bitmap(Stream) 这个 Bitmap 的 constructor 获得这个图片资源的 Bitmap 对象;如果我们嵌入的是一文本文件,我们可以使用StreamReader将它的内容读出来。
下面给一个简单的以文本文件为资源的DEMO
step1: 资源文件
将文件嵌入Assembly,上面已说了怎么做
step2: 调用资源文件
public Stream GetEmbeddedResource()
{
return System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("ResoureceDemo.test.txt") ;//关键的一句
}//ResoureceDemo.test.txt解释一哈
//ResoureceDemo表示命名空间,test.txt文本文件名称
private void button1_Click(object sender, System.EventArgs e)
{
Stream sResponse;
StreamReader srResponse;
sResponse=GetEmbeddedResource();
srResponse=new StreamReader(sResponse);
string txtDemo=srResponse.ReadToEnd().ToString();
label1.Text =txtDemo;
}
当然,以图片格式的方式也一样的操作。不在举例了,最后有个工具大家不要忘了:
resgen.exe 专门用来做资源文件类型之间的转换。支持 .txt <-> .resx <-> .resources 之间的转换。