一、添加嵌入的资源
1、新建一窗体应用程序,用于演示该程序集运行时访问嵌入资源
2、用鼠标右键单击项目名称,单击添加,添加新建项,然后单击添加新项。
3、在新建项目对话框中,从菜单上,选择文本文件,并命名为 MyTextFile.txt 的文件。在集成的开发环境 (IDE) 中打开文本文件,添加一些文本,比如"abc",然后关闭该文件。
4、重复步骤 2 和 3 将位图图像添加到项目中,但在选择新的项目类型时不是选择文本文件,而是选择位图文件,然后将文件名更改为MyImage.bmp。在 IDE 中打开新图像, 绘制一些内容,然后关闭该文件。
5、用鼠标右键单击文本文件或位图,然后选择属性。
6、在属性对话框中,找到生成操作属性。默认情况下,此属性设置为内容。请单击该属性并将生成操作属性更改为嵌入的资源。
7、其他文件重复步骤 4 和 5。
下次生成项目时,编译器会将这些文件添加到您的程序集。
注: 资源文件名称是区分大小写。当您访问的资源时, 必须使用完全相同的拼写和大小写的文件名称。如果您不使用精确拼写和大小写的文件名访问 ManifestResourceStream 方法调用返回 Nothing 和系统不引发异常。
二、访问资源
若要访问嵌入的清单的程序集的资源,导入System.IO和System.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!"); }
- 向表单中添加文本框控件。
- 将另一个按钮控件添加到窗体中,然后再将它的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("写入文本错误");
}
}
}
}