Как внедрить и доступ к ресурсам с помощью Visual C#

Переводы статьи Переводы статьи
Код статьи: 319292 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

В данной статье описывается использование Visual C# внедрить ресурсы в составе сборки, а затем получить доступ к ресурсам во время выполнения.

Обзор

Платформа.NET Framework можно инкапсулировать файлы как часть скомпилированной сборки. Эти файлы называются внедренными ресурсами. Эти ресурсы полностью отделены от файлов .resources или .resx, связанные со сборкой. Для доступа к этим ресурсам во время выполнения с помощью класса сборки , пространства имен System.Reflection .

Главное преимущество внедрение ресурсов в манифест: поскольку файлы являются частью скомпилированной сборки, пользователь не может случайно удалить или потерять файлы, которые важны для приложения, что в некоторых случаях может помешать выполнению программы. Единственным ограничением такого подхода является нельзя сохранять изменения в этот файл в сборку без перекомпиляции программы. Таким образом включают только файлы, которые не изменяются во время существования приложения в качестве внедренного ресурса.

Пошаговая демонстрация

Добавление внедренных ресурсов в проект, необходимо сначала добавить файлы как часть проекта. После добавления файлов в проект, можно получить доступ к и отображать ресурсы через пространство имен System.Reflection .

Добавление внедренных ресурсов

Чтобы добавить текстовый файл и файл изображения в проект как внедренные ресурсы, выполните следующие действия.
  1. Создайте новый проект приложения Windows для этой демонстрации. Эта форма используется для отображения ресурсов, которые доступны из выполняемой сборки во время выполнения.
  2. Щелкните правой кнопкой мыши имя проекта, нажмите кнопку Добавитьи выберите команду Добавить новый элемент.
  3. В диалоговом окне Новый элемент меню выберите Текстовый файл и назовите файл MyTextFile.txt. Когда файл открывается в интегрированной среде разработки (IDE), добавить текст, а затем закройте файл.
  4. Повторите шаги 1 и 2, чтобы добавить растровое изображения в проект, но вместо выбора Текстовый файл как нового типа элемента, выберите Файл точечного рисунка и измените имя на MyImage.bmp. При открытии нового изображения в интегрированной среде разработки нарисовать что-нибудь на изображении, а затем закройте файл.
  5. Щелкните правой кнопкой мыши рисунок или текстовый файл и выберите пункт Свойства.
  6. В диалоговом окне свойств найдите свойство Действие при построении . По умолчанию это свойство имеет значение для содержимого. Нажмите кнопку Свойства и измените свойство Действие при построении значение Внедренный ресурс.
  7. Повторите шаги 4 и 5 для других файлов.
В следующий раз при построении проекта, компилятор добавляет эти файлы сборки. Компилятор добавляет корневое пространство имен проекта имя ресурса, если он включен в проект. Например если корневое пространство имен проекта MyNamespace, ресурсы называются MyNamespace.MyTextFile.txt и MyNamespace.MyImage.bmp.

Примечание: имена файлов ресурсов учитывается регистр. При доступе к ресурсам, необходимо использовать точное написание и регистр имени файла. Если не использовать точное написание и регистр знаков в имени файла, вызов метода доступа к ManifestResourceStream возвращает null и система не вызывает исключение.

Примечание: Если вы хотите проверить имена ресурсов, можно использовать 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();
				
Чтение информации из ресурса в поток выполняется с помощью вызова метода ко. Параметр, передаваемый этому методу — имя ресурса, на который осуществляется. Двух ресурсов затем считываются в их соответствующие потоки, когда выполняется событие 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!");
   }
				
Оператор Try-Catch , известные как структурной обработки в .NET используется для перехвата ошибок, произошедших во время экземпляр класса сборки имеет доступ к ресурсам.

Показать ресурсы

В этом примере используется две кнопки для отображения внедренных ресурсов. При нажатии первой кнопки растрового изображения, основанный на ресурс, который считывается из сборки создается и отображается в элементе управления PictureBox формы. Вторая кнопка считывает из текстового ресурса и отображает текст в текстовом поле.

Для отображения внедренных ресурсов, выполните следующие действия.
  1. Добавьте в форму элемент управления PictureBox .
  2. Добавьте новый элемент управления Button в форму и измените его свойство Text для Отображения изображения.
  3. Дважды щелкните кнопку, чтобы открыть в средстве просмотра кода события Click и затем вставьте следующий код в событие:
       try
       {
          pictureBox1.Image = new Bitmap(_imageStream);			       }
       catch 
       {
          MessageBox.Show("Error creating image!");
       }
    					
    Этот код создает новый экземпляр растрового изображения, который основан на поток ресурсов, которая считывается в событии Load формы.

  4. Добавьте в форму элемент управления TextBox .
  5. Добавьте другой элемент управления Button в форму и измените его свойство 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!");
            }		
         }
      }
   }
				
Примечание Следует изменять код в 2005 г. Visual Studio или Visual Studio 2008. При создании проекта Windows Forms Visual C# Добавляет одну форму проекта по умолчанию. Эта форма с именем Form1. Два файла, которые представляют собой формы с именем Form1.cs и Form1.designer.cs. При написании кода в файле Form1.cs. В файле Designer.cs является где конструктор Windows Forms записывает код, реализующий все действия, выполненные путем добавления элементов управления. Дополнительные сведения о конструктор Windows Forms в Visual C# 2005 или в Visual Studio 2008 посетите следующий веб-узел корпорации Майкрософт:
http://msdn2.Microsoft.com/en-us/library/ms173077.aspx

Устранение неполадок

Поскольку имена ресурсов учитывается регистр, убедитесь, что используется правильное написание и регистр ресурсов, которые доступны. ILDASM можно использовать для чтения данных манифеста, чтобы проверить точное написание ресурсы.

Ссылки

Дополнительные сведения см. ниже Microsoft Developer Network (MSDN) веб-узлов:
Пространство имен System.Reflection
.aspx 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 http://msdn2.Microsoft.com/en-us/library/System.Reflection.Assembly.getmanifestresourcestream (vs.71)

Свойства

Код статьи: 319292 - Последний отзыв: 30 сентября 2012 г. - Revision: 6.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# 2008 Express Edition
Ключевые слова: 
kbsweptvs2008 kbhowtomaster kbmt KB319292 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке: 319292

Отправить отзыв

 

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