Текстовый файл в ресурсе сборки

На днях спрашивали у меня, как внедрить в сборку текстовый файл и затем прочитать его. Вообще-то задача внедрения и получения текстового файла из сборки по сути аналогична тому, как написано в статье Сергея Розовика Как вытащить иконку из ресурса. Заметил, что эта, в общем-то, несложная задача ставит многих разработчиков в тупик (может быть это потому, что они не читают хороших блогов :-). Поэтому решил описать ее подробнее и для более общего случая. Процесс внедрения может быть описан следующими шагами:

  • Добавляем файл как Embedded Resource.
  • По имени файла в ресурсе получаем поток, позволяющий считать файл.
  • Работаем с потоком, чтобы получить нужный программный объект. Например, строку с содержимым текстового файла или объект изображения/иконки.

А теперь более подробно. Для внедрения файла в сборку, надо подключить его к проекту и выставить значение свойства Build Action в Embedded Resource. Теперь после компиляции файл будет внедрен в ресурсы сборки. Переходим к извлечению. Имя файла в ресурсе формируется из префикса, в качестве которого выступает Default namespace, из свойств проекта, и относительного пути к файлу (включая само имя файла).

Для надежности можно посмотреть имя внедренного файла через ildasm.exe:

Остается последний шаг — получить из ресурсов сборки поток (объект типа Stream) и извлечь из него данные. Код по извлечению потока из ресурсов сборки и данных из потока удобно поместить во вспомогательный класс. Пример такого класса приведен во фрагменте кода ниже.

static class ResourceHelper
{
private static Stream GetStream(string resourceName)
{
return typeof(ResourceHelper).Assembly.GetManifestResourceStream(resourceName);
}

internal static string GetText(string resourceName)
{
using (StreamReader reader = new StreamReader(GetStream(resourceName)))
{
return reader.ReadToEnd();
}
}

internal static Image GetImage(string resourceName)
{
using (Stream imageStream = GetStream(resourceName))
{
return Image.FromStream(imageStream);
}
}
}

И, наконец, пример использования вспомогательного класса:


private void Form1_Load(object sender, EventArgs e)

{

pictureBox1.Image = ResourceHelper.GetImage("WindowsApplication2.Images.Logo.PNG");

textBox1.Text = ResourceHelper.GetText("WindowsApplication2.Scripts.SampleSQL.txt");

}










Комментарии

Анонимный написал(а)…
Смотрю студия у вас 2005. Тогда зачем такие сложности?! Зайдите на вкладку Resources добавьте файл, пересоберите проект и всё готово :) Будете иметь доступ к тексту этого файла через Resources.ИмяРесурса
Андрей Бороздин написал(а)…
Спасибо! По правде говоря, не знал и делал по старинке :). Хотя вопрос относился к Visual Studio 2003.

Популярные сообщения из этого блога

Команды docker save/load, docker export/import – в чем отличие, как и когда ими пользоваться

Как узнать, кто заблокировал файл или папку

Эрик Гамма переходит на работу в Майкрософт