2013-12-11 3 views
6

Возможно, мне не хватает чего-то очень простого, но в чем преимущество использования отражения для извлечения встроенного ресурса из той же сборки, которая содержит ресурс, в отличие от просто получить его через файл .resx? Я вижу это много, но не понимаю - есть ли причина использовать Assembly.GetExecutingAssembly().GetManifestResourceStream(resource) по сравнению с файлом resx Resources.resource? Даже Microsoft делает это: How to embed and access resources.Файл ресурсов (.resx) против отражения для доступа к встроенному ресурсу

Что я имею в виду именно так: предположим, у меня есть сборка MyAssembly, которая содержит встроенный ресурс Config.xml. Узел имеет MyClass, который реализует метод, который возвращает указанный ресурс в виде строки:

public string GetConfigXML() // returns the content of Config.xml as a string 

Часто я вижу это реализовано, как это, с помощью отражения, чтобы получить ресурс:

public string GetConfigXML() 
{ 
    Stream xmlStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyAssembly.Config.xml"); 
    string xml = GetStringFromStream(xmlStream); 
    return xml; 
} 

Почему использовать GetManifestResourceStream() когда вы можете:

  1. добавить файл ресурсов (Resource.resx) к MyAssembly проекта в Visual Studio;
  2. добавить Config.xml в список 'Files';
  3. получить содержание Config.xml в гораздо более простым способом: string xml = Resource.Config;

Я не знаю, как Visual Studio обрабатывает .resx файлы внутри, но я сомневаюсь, что это просто копирует ресурс в файл .resx (в в этом случае вы получите дублированные ресурсы). Я предполагаю, что он также не использует отражение внутри, поэтому почему бы просто не использовать файлы .resx в таких ситуациях, которые кажутся мне более удобными для меня?

+1

Получение через сборку * может * сделать сборку знаний о спутнике, загружаемую для вас, тогда как загрузка resx оставила бы вас за выбор правильной для текущей культуры. –

ответ

3

но что выгода от использования отражения для извлечения внедренного ресурса

общего блага, что стоит за какой-либо причиной для преобразования данных из одного формата в другой. Скорость, скорость, скорость и удобство.

XML - довольно приличный формат для хранения ваших ресурсов. У вас будет очень хорошая гарантия, что вы сможете получить исходный ресурс через 10 лет, когда оригинал затерялся в тумане времени и пара машинных изменений без хороших резервных копий. Но это довольно сложный формат, который нужно читать, XML очень подробный, и для определения фрагмента требуется чтение с самого начала файла.

Проблемы, которые исчезают, когда Resgen.exe скомпилирует XML-файл в файл .resource. Бинарный формат, который можно связать с метаданными сборки и содержать исходные байты в ресурсе. И непосредственно отображается в память при загрузке сборки, нет необходимости находить другой файл и открывать его, читать и преобразовывать данные. Большая разница.

Использовать конструктор ресурсов, чтобы избежать непосредственного использования GetManifestResourceStream(). Еще больше удобства.

+0

Ярмарка баллов, спасибо.Мне кажется, однако, что преимущество использования рефлексии для прямого доступа к ресурсам, скорее всего, станет очевидным только в том случае, если вы храните большое количество файлов ресурсов в .resx, в то время как для небольшого количества встроенных ресурсов отражение действительно будет медленнее (поскольку вам нужно «GetManifestResourceStream», а затем преобразовать его в соответствующий формат) по сравнению с чтением из .resx? – w128

+4

Вы, кажется, действуете из общего мифа о том, что «Отражение медленное». Это происходит только медленно, когда вы сравниваете, скажем, использование свойства напрямую с помощью Reflection для получения значения свойства. Конечно, вы не можете победить наносекунду с отражением. GetManifestResourceStream * не * медленный по сравнению с открытием файла. Это легко на 50 000 раз быстрее, отдавайте или принимайте порядок :) –

Смежные вопросы