您的位置:首页 > 编程语言 > C#

C#读取嵌入资源(程序集清单资源)

2014-04-13 15:51 369 查看
一、添加嵌入的资源

1、新建一窗体应用程序,用于演示该程序集运行时访问嵌入资源

2、用鼠标右键单击项目名称,单击添加,添加新建项,然后单击添加新项

3、在新建项目对话框中,从菜单上,选择文本文件,并命名为
MyTextFile.txt 的文件。在集成的开发环境 (IDE) 中打开文本文件,添加一些文本,比如"abc",然后关闭该文件。

4、重复步骤
2 和 3 将位图图像添加到项目中,但在选择新的项目类型时不是选择文本文件,而是选择位图文件,然后将文件名更改为MyImage.bmp。在
IDE 中打开新图像, 绘制一些内容,然后关闭该文件。

5、用鼠标右键单击文本文件或位图,然后选择属性

6、在属性对话框中,找到生成操作属性。默认情况下,此属性设置为内容。请单击该属性并将生成操作属性更改为嵌入的资源

7、其他文件重复步骤
4 和 5。

下次生成项目时,编译器会将这些文件添加到您的程序集。

注:
资源文件名称是区分大小写。当您访问的资源时, 必须使用完全相同的拼写和大小写的文件名称。如果您不使用精确拼写和大小写的文件名访问 ManifestResourceStream 方法调用返回 Nothing 和系统不引发异常。 


二、访问资源

若要访问嵌入的清单的程序集的资源,导入System.IOSystem.Reflection的命名空间,如下:


using System.IO;
using System.Reflection;


在常规声明区域中定义如下代码,在加载窗体时会读取程序集中的资源:


Assembly _assembly;
Stream _imageStream;
StreamReader _textStreamReader;


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Reflection;

namespace ResTest
{
public partial class Form1 : Form
{
Assembly _assembly ;
Stream _imageStream;
StreamReader _textStreamReader;

public Form1()
{
InitializeComponent();
}

}
}
双击窗体进入窗体的Load事件

若要读取当前程序集的资源,必须获取该程序集的一个实例。若要执行此操作,使用GetExecutingAssembly方法,如下所示:


_assembly = Assembly.GetExecutingAssembly();


GetManifestResourceStream方法从资源中读取信息到流中。传递给此方法的参数是要访问的资源的名称

注:里面的格式为:    命名空间.相对文件夹名.文件名(包含扩展名)。

在该窗体的Load事件中,首先获取资源所在程序集,然后读取两个资源到其相应的流。


_imageStream = _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp");
_textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNameSpace.MyTextFile.txt"));


private void Form1_Load(object sender, EventArgs e)
{
try
{
_assembly = Assembly.GetExecutingAssembly();//获取当前执行代码的程序集
_imageStream = _assembly.GetManifestResourceStream("ResTest.MyImage.bmp");
_textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("ResTest.MyTextFile.txt"));
}
catch
{
MessageBox.Show("访问资源错误");
}
}


三、显示资源

此示例使用两个按钮以显示嵌入的资源。单击第一个按钮时,从程序集中读取位图图像并显示在窗体的图片框控件。第二个按钮读取文本资源,并在文本框中显示文本。

若要显示嵌入的资源,请执行以下步骤:

向表单中添加一个图片框控件。
向窗体中,添加一个新按钮控件,然后将它的Text属性更改为显示图像
双击该按钮以打开其Click事件,在代码查看器中,然后将以下代码粘贴在这种情况:


try
{
pictureBox1.Image = new Bitmap(_imageStream);			       }
catch
{
MessageBox.Show("Error creating image!");
}


此代码会生成新的基于窗体的Load事件中读取资源流的位图的实例。

向表单中添加文本框控件。
将另一个按钮控件添加到窗体中,然后再将它的Text属性更改为获取文本
双击设计编辑器中打开Click_Event按钮,该按钮,然后将以下代码粘贴在该事件中:


try
{
if(_textStreamReader.Peek() != -1)
{
textBox1.Text = _textStreamReader.ReadLine();
}
}
catch
{
MessageBox.Show("Error writing text!");
}


此代码将确定要读取的字符是否仍然存在在流中。如果找到字符,文本框中将读取一行。

按 F5 键运行该应用程序。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Reflection;

namespace ResTest
{
public partial class Form1 : Form
{
Assembly _assembly ;
Stream _imageStream;
StreamReader _textStreamReader;

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
try
{
pictureBox1.Image = new Bitmap(_imageStream);
}
catch
{
MessageBox.Show("创建图像错误");
}
}

private void Form1_Load(object sender, EventArgs e)
{
try
{
_assembly = Assembly.GetExecutingAssembly();//获取当前执行代码的程序集
_imageStream = _assembly.GetManifestResourceStream("ResTest.MyImage.bmp");
_textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("ResTest.MyTextFile.txt"));
}
catch
{
MessageBox.Show("访问资源错误");
}
}

private void button2_Click(object sender, EventArgs e)
{
try
{
if (_textStreamReader.Peek() != -1)
{
textBox1.Text = _textStreamReader.ReadLine();
}
}
catch
{
MessageBox.Show("写入文本错误");
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: