如何嵌入和使用 Visual C# 中访问资源

文章翻译 文章翻译
文章编号: 319292 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

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

概述

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

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

分步演示

若要在项目中添加嵌入的资源必须首先将文件添加为项目的一部分。将文件添加到您的项目后,您可以访问和显示通过 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 方法调用返回 Nothing 和系统不引发异常。

: 如果要验证的资源名称则可以使用 Microsoft 中间语言反汇编程序 (ILDASM),以查看其中列出了所包含的资源将清单数据。

访问资源

若要进行您具有嵌入在程序集的清单中的资源 System.IO 和导入 System.Reflection 命名空间,如下所示:
   using System.IO;
   using System.Reflection;
				
System.IO 命名空间提供的流定义和 System.Reflection 命名空间定义此 程序集 类提供了访问程序集中嵌入的资源的方法。

在通用声明区域下列声明时, 在窗体加载时读取从程序集资源:
   Assembly _assembly;
   Stream _imageStream;
   StreamReader _textStreamReader;
				
: 访问窗体在代码编辑器中的 Load 事件,双击窗体在设计编辑器中。

若要读取从执行当前代码的程序集的资源,您必须获取该程序集的实例。若要执行此操作使用了的程序集的 GetExecutingAssembly 方法,如下所示:
   _assembly = Assembly.GetExecutingAssembly();
				
流以从资源读取该信息执行 GetManifestResourceStream 的方法调用。传递给此方法的参数是资源的要对其进行访问的名称。然后在这两个资源执行窗体的 Load 事件时读取其相应的流。
   _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!");
   }
				
称为.net,结构化的错误处理Try Catch 语句用于捕获该 程序集 类的实例访问该资源时可能发生的任何错误。

显示资源

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

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

  4. TextBox 控件添加到窗体。
  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.Drawing;
   using System.Collections;
   using System.ComponentModel;
   using System.Windows.Forms;
   using System.Data;

   using System.IO;
   using System.Reflection;

   namespace MyNamespace
   {
      /// <summary>
      /// Summary description for Form1.
      /// </summary>
      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;
         /// <summary>
         /// Required designer variable.
         /// </summary>
         private System.ComponentModel.Container components = null;

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

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

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

      #region Windows Form Designer generated code
         /// <summary>
         /// Required method for Designer support - do not modify
         /// the contents of this method with the code editor.
         /// </summary>
         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;

         /// <summary>
         /// The main entry point for the application.
         /// </summary>
         [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 中编写您的代码。在 Windows 窗体设计器写入实现的所有操作的代码通过将控件添加执行的 Designer.cs 文件。 有关 Windows 窗体设计器在 Visual C# 2005年中或在 Visual Studio 2008 中的详细信息,请访问下面的 Microsoft 网站:
http://msdn2.microsoft.com/en-us/library/ms173077.aspx

故障排除

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

参考

有关详细的信息,请参阅下面的 Microsoft 开发人员网络 (MSDN) 的网站:
System.Reflection 命名空间
http://msdn2.microsoft.com/en-us/library/system.reflection(vs.71).aspx

程序集类
http://msdn2.microsoft.com/en-us/library/system.reflection.assembly(vs.71).aspx

Assembly.GetManifestResourceStream 方法
http://msdn2.microsoft.com/en-us/library/system.reflection.assembly.getmanifestresourcestream(vs.71).aspx

属性

文章编号: 319292 - 最后修改: 2008年7月15日 - 修订: 3.1
这篇文章中的信息适用于:
  • Microsoft Visual C# .NET 2002 标准版
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# 2008 Express Edition
关键字:?
kbmt kbsweptvs2008 kbhowtomaster KB319292 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 319292
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com