В настоящее время вы работаете в автономном режиме; ожидается повторное подключение к Интернету

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

ВНИМАНИЕ! Данная статья переведена с использованием программного обеспечения Майкрософт для машинного перевода и, возможно, отредактирована посредством технологии Community Translation Framework (CTF). Корпорация Майкрософт предлагает вам статьи, обработанные средствами машинного перевода, отредактированные членами сообщества Майкрософт и переведенные профессиональными переводчиками, чтобы вы могли ознакомиться со всеми статьями нашей базы знаний на нескольких языках. Статьи, переведенные с использованием средств машинного перевода и отредактированные сообществом, могут содержать смысловое, синтаксические и (или) грамматические ошибки. Корпорация Майкрософт не несет ответственности за любые неточности, ошибки или ущерб, вызванные неправильным переводом контента или его использованием нашими клиентами. Подробнее об CTF можно узнать по адресу http://support.microsoft.com/gp/machine-translation-corrections/ru.

Эта статья на английском языке: 319292
Для версии .NET по Visual Basic корпорации Майкрософт в этой статье см. 319291.

В данной статье относится к следующие пространства имен библиотеки классов платформа.NET Framework, Майкрософт:
  • System.Reflection
  • System.IO

В ЭТОЙ ЗАДАЧЕ

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

back to the top

Обзор

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

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

back to the top

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

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

back to the top

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

Чтобы добавить текстовый файл и файл изображения в проект как внедренные ресурсы, выполните следующие действия.
  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 возвращает Nothingи системы не вызывает исключение.

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

back to the top

Доступ к ресурсам

Доступ к ресурсам, которые внедрены в манифесте сборки, импорта 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!");   }				
Оператор Try-Catch , называемый структурной обработки в [.NET, используется для перехвата ошибок, произошедших во время экземпляр класса сборки имеет доступ к ресурсам.

back to the top

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

В этом примере используется две кнопки для отображения внедренных ресурсов. При нажатии первой кнопки растрового изображения, который основан на ресурс, который считывается из сборки создается и отображается в элементе управления 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 для запуска приложения.
back to the top

Полный текст кода

   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 Forms, C# добавляет одну форму в проект по умолчанию. Эта форма с именем Form1. Два файла, которые представляют собой формы с именем Form1.cs и Form1.designer.cs. Напишите код в файле Form1.cs. Файл Designer.cs, где конструктор Windows Forms записывает код, реализующий все действия, выполненные путем добавления элементов управления. Дополнительные сведения о конструкторе Windows Forms в Visual C# 2005 или Visual Studio 2008 посетите следующий веб-узел корпорации Майкрософт:back to the top

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

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

back to the top
Ссылки
Дополнительные сведения см. ниже веб-узлов Microsoft Developer Network (MSDN):back to the top

Внимание! Эта статья переведена автоматически

Свойства

Номер статьи: 319292 — последний просмотр: 11/01/2015 04:30:00 — редакция: 7.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
Отзывы и предложения