0

0

如何嵌入和使用C#来访问资源的代码详解

黄舟

黄舟

发布时间:2017-03-14 13:54:30

|

2552人浏览过

|

来源于php中文网

原创

c#中如何使用嵌入的资源?

本分步指南介绍如何使用 C# 来作为程序集的一部分嵌入资源,然后在运行时访问资源。

概述

.NET Framework 可以封装文件,为已编译的程序集的一部分。这些文件称为嵌入的资源。这些资源是完全独立的程序集相关联的.resources 和.resx 文件。您可以在运行时通过的System.Reflection命名空间程序集类访问这些资源。

嵌入的清单资源的主要优点是因为这些文件是已编译的程序集的一部分,用户不能意外删除或误放到您的应用程序,这在某些情况下可能会阻止程序的执行至关重要的文件。这种方法的一个限制是您无法保存任何更改到此文件的程序集无需重新编译该程序。正因为如此,只包含作为嵌入资源的应用程序的生存期内将不会更改的文件。

分步演示

若要将嵌入的资源添加到您的项目中,必须首先为您的项目的一部分添加这些文件。将文件添加到项目后,您可以访问和显示通过System.Reflection命名空间中的资源。

添加嵌入的资源

要添加文本文件和图像文件作为资源嵌入到您的项目,请按照下列步骤操作:

  1. 为此演示创建一个新的 Windows 应用程序项目。此窗体用于显示从执行的程序集在运行时访问的资源。

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

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

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

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

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

  7. 对另一个文件重复步骤 4 和 5。

下一次生成项目时,编译器将这些文件添加到您的程序集。它包含在项目中时,编译器会将项目的根命名空间添加到的资源的名称。例如,如果您的项目的根命名空间是 MyNamespace,资源被命名为 MyNamespace.MyTextFile.txt 和 MyNamespace.MyImage.bmp。

请注意: 资源文件的名称是区分大小写。在访问资源时,您必须使用的确切拼写和大小写的文件名。如果您不使用的确切拼写和大小写的文件名,该方法调用来访问ManifestResourceStream返回执行任何操作,并且系统不会引发异常。

注意: 如果您想要验证这些资源名称,您可以使用 Microsoft 中间语言拆装器 (ILDASM) 查看清单数据,其中列出了所包括的资源。

访问资源

若要访问已在您的程序集的清单中嵌入的资源,导System.IOSystem.Reflection命名空间中,按如下所述:

   using System.IO;
   using System.Reflection;				

System.IO命名空间提供了流的定义和System.Reflection命名空间中定义的程序集提供的类的方法,以访问程序集中嵌入的资源。

声明在以下常规声明区域中的时,在加载窗体时读取从程序集中的资源:

   Assembly _assembly;
   Stream _imageStream;
   StreamReader _textStreamReader;				

注意: 要访问在代码编辑器中的窗体的Load事件,请双击该窗体在设计编辑器。

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

   _assembly = Assembly.GetExecutingAssembly();				

从资源到流中读取信息,对GetManifestResourceStream的方法调用执行。传递给此方法的参数是要访问的资源的名称。在执行该窗体的Load事件,然后读取两个资源到其相应的流。

PageGen
PageGen

AI页面生成器,支持通过文本、图像、文件和URL一键生成网页。

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

在窗体的Load事件中的代码如下所示:

   try
   {
      _assembly = Assembly.GetExecutingAssembly();
      _imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp");
      _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
   }
   catch
   {
      MessageBox.Show("Error accessing resources!");
   }				

Try-catch语句中,称为在.NET 中,结构化的错误处理用于捕捉的程序集类的实例访问资源时可能发生的任何错误。

显示资源

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

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

  1. 图片框控件添加到窗体中。

  2. 将一个新的按钮控件添加到窗体中,然后再将它的Text属性更改为显示图像

  3. 双击该按钮以打开其Click事件,在代码查看器中,然后将下面的代码粘贴在这种情况:

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

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

  5. 向表单中添加文本框控件。

  6. 将另一个按钮控件添加到窗体上,然后再将它的Text属性更改为获取文本

  7. 双击设计编辑器中打开Click_Event的按钮,该按钮,然后将下面的代码粘贴在该事件中:

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

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

  9. 按 F5 键运行该应用程序。

完整的代码

   using System;
   using System.Drawing;
   using System.Collections;
   using System.ComponentModel;
   using System.Windows.Forms;
   using System.Data;

   using System.IO;
   using System.Reflection;

   namespace MyNamespace
   {
      /// 
      /// Summary description for Form1.
      /// 
      public class Form1 : System.Windows.Forms.Form
      {
         private System.Windows.Forms.PictureBox pictureBox1;
         private System.Windows.Forms.TextBox textBox1;
         private System.Windows.Forms.Button button1;
         private System.Windows.Forms.Button button2;
         /// 
         /// Required designer variable.
         /// 
         private System.ComponentModel.Container components = null;

         public Form1()
         {
            // 
            // Required for Windows Form Designer support.
            // 
            InitializeComponent();

            // 
            // TODO: Add any constructor code after InitializeComponent call.
            // 
         }

         /// 
         /// Clean up any resources being used.
         /// 
         protected override void Dispose( bool disposing )
         {
            if( disposing )
            {
               if (components != null) 
               {
                  components.Dispose();
               }
            }
            base.Dispose( disposing );
         }

      #region Windows Form Designer generated code
         /// 
         /// Required method for Designer support - do not modify
         /// the contents of this method with the code editor.
         /// 
         private void InitializeComponent()
         {
            this.pictureBox1 = new System.Windows.Forms.PictureBox();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // pictureBox1
            // 
            this.pictureBox1.Location = new System.Drawing.Point(4, 8);
            this.pictureBox1.Name = "pictureBox1";
            this.pictureBox1.Size = new System.Drawing.Size(284, 192);
            this.pictureBox1.TabIndex = 0;
            this.pictureBox1.TabStop = false;
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(92, 236);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(192, 20);
            this.textBox1.TabIndex = 1;
            this.textBox1.Text = "textBox1";
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(8, 208);
            this.button1.Name = "button1";
            this.button1.TabIndex = 2;
            this.button1.Text = "Show Image";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // button2
            // 
            this.button2.Location = new System.Drawing.Point(8, 236);
            this.button2.Name = "button2";
            this.button2.TabIndex = 3;
            this.button2.Text = "Get Text";
            this.button2.Click += new System.EventHandler(this.button2_Click);
            // 
            // Form1
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.AddRange(new System.Windows.Forms.Control[]{
                                                                     this.button2,
                                                                     this.button1,
                                                                     this.textBox1,
                                                                     this.pictureBox1});

            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
         }
      #endregion

         Assembly _assembly;
         Stream _imageStream;
         StreamReader _textStreamReader;

         /// 
         /// The main entry point for the application.
         /// 
         [STAThread]
         static void Main() 
         {
            Application.Run(new Form1());
         }

         private void Form1_Load(object sender, System.EventArgs e)
         {
            try
            {
               _assembly = Assembly.GetExecutingAssembly();
               _imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp");
              _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
            }
            catch
            {
               MessageBox.Show("Error accessing resources!");
            }		
         }

         private void button1_Click(object sender, System.EventArgs e)
         {
            try
            {
               pictureBox1.Image = new Bitmap(_imageStream);
            }
            catch 
            {
               MessageBox.Show("Error creating image!");
            }
         }

         private void button2_Click(object sender, System.EventArgs e)
         {
            try
            {
               if(_textStreamReader.Peek() != -1)
               {
                  textBox1.Text = _textStreamReader.ReadLine();
               }
            }
            catch
            {
               MessageBox.Show("Error writing text!");
            }		
         }
      }
   }				

注意在 Visual Studio 2005年中或在 Visual Studio 2008 中,则应更改代码。创建一个 Windows 窗体项目时,Visual C# 一个窗体向项目中添加默认情况下。此窗体名为 Form1。表示窗体的两个文件称为 Form1.cs 和 Form1.designer.cs。Form1.cs 中编写您的代码。Designer.cs 文件是 Windows 窗体设计器编写的代码实现的所有操作,您通过添加控件来执行。有关 Windows 窗体设计器在 Visual C# 2005年或 Visual Studio 2008 中的详细信息,请访问下面的 Microsoft Web 站点:

http://msdn2.microsoft.com/en-us/library/ms173077.resource3x

故障排除

由于资源名称是区分大小写,请验证您正在使用相应的拼写和大小写的资源的访问。您可以使用 ILDASM 读取清单的数据,来验证资源的确切拼写。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

75

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

17

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

38

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

1

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

3

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

8

2026.01.28

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

23

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

122

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

52

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.8万人学习

C 教程
C 教程

共75课时 | 4.3万人学习

C++教程
C++教程

共115课时 | 14.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号