Текстовый файл в ресурсе сборки
На днях спрашивали у меня, как внедрить в сборку текстовый файл и затем прочитать его. Вообще-то задача внедрения и получения текстового файла из сборки по сути аналогична тому, как написано в статье Сергея Розовика Как вытащить иконку из ресурса. Заметил, что эта, в общем-то, несложная задача ставит многих разработчиков в тупик (может быть это потому, что они не читают хороших блогов :-). Поэтому решил описать ее подробнее и для более общего случая. Процесс внедрения может быть описан следующими шагами:
- Добавляем файл как 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");
}
Комментарии