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

2023-11-08

一、添加嵌入的资源

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("访问资源错误");
            }
        }

三、显示资源

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

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

  1. 向表单中添加一个图片框控件。
  2. 向窗体中,添加一个新按钮控件,然后将它的Text属性更改为显示图像
  3. 双击该按钮以打开其Click事件,在代码查看器中,然后将以下代码粘贴在这种情况:
       try
       {
          pictureBox1.Image = new Bitmap(_imageStream);			       }
       catch 
       {
          MessageBox.Show("Error creating image!");
       }
    					
    此代码会生成新的基于窗体的Load事件中读取资源流的位图的实例。

  4. 向表单中添加文本框控件。
  5. 将另一个按钮控件添加到窗体中,然后再将它的Text属性更改为获取文本
  6. 双击设计编辑器中打开Click_Event按钮,该按钮,然后将以下代码粘贴在该事件中:
       try
       {
          if(_textStreamReader.Peek() != -1)
          {
             textBox1.Text = _textStreamReader.ReadLine();
          }
       }
       catch
       {
          MessageBox.Show("Error writing text!");
       }
    					
    此代码将确定要读取的字符是否仍然存在在流中。如果找到字符,文本框中将读取一行。

  7. 按 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("写入文本错误");
            }
        }
    }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#读取嵌入资源(程序集清单资源) 的相关文章

随机推荐