Поделиться через


Файловые ресурсы в MRM

Ресурсы файлов в MRM по сути совпадают со строковыми ресурсами, за исключением того, что во время выполнения свойство ResourceCandidate.Kind будет путь вместо String. Значения ресурсов — это только строки — имена файлов, а не фактическое содержимое файла. В большинстве случаев индексированные файлы даже не должны существовать во время сборки.

Если целевое приложение будет использовать встроенную среду выполнения MRT (Windows.ApplicationModel.Resources), можно использовать ResourceCandidate.GetValueAsFileAsync или ResourceCandidate.GetValueAsStreamAsync для автоматического поиска и загрузки файла. Если вы используете версию ПАКЕТА SDK WinApp для MRT (Microsoft.Windows.ApplicationModel.Resources), то необходимо вручную загрузить файл самостоятельно. Вы также можете вручную загрузить файл с помощью среды выполнения MRT buit.

Существует два способа добавления файлов в индексатор MRM:

  • MrmIndexFile является самой общей и гибкой функцией.
  • MrmIndexFileAutoQualifiers автоматически выводит имя ресурса и квалификаторы из имени файла.

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

Для альтернативного ссылки на файлы по имени можно использовать mrmIndexEmbeddedData для внедрения данных непосредственно в файл PRI. Дополнительные сведения см. в разделе "Внедренные данные ниже".

Именование файлов

Основной целью ресурса на основе файлов является передача строки в такие функции, как CreateFile(), fopen()или конструктор std::fstream. Так как окончательный путь к файлам на диске обычно не известен во время сборки, имена файлов обычно являются относительными путями, которые будут разрешаться в рабочем каталоге приложения (или другом хорошо известном каталоге) во время выполнения. Хотя можно включить любую произвольную строку в качестве имени файла (включая абсолютные или сетевые пути), это обычно не полезно.

Имена корневых и относительных файлов проекта

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

Внедренные данные

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

В обычной системе Windows каждый файл тратит в среднем 2 КБ дискового пространства из-за выделения места на диске. Для приложений, содержащих большое количество небольших файлов (например, значков), это среднее может быть еще выше. Внедрив двоичные данные файлов непосредственно в PRI-файл, это пространство для каждого файла не тратится.

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

Несмотря на эти преимущества, использование внедренных двоичных данных имеет ограничения, особенно во время разработки внутреннего цикла:

  • Время сборки увеличивается, так как файлы, содержащие двоичные данные, необходимо загрузить и добавить в индексатор. Добавление ресурсов на основе файлов не требует дополнительного доступа к диску во время сборки (доступ к диску откладывается до времени выполнения).
  • Отладка проблем с файлом PRI (с помощью xml-дампов) сложнее, так как вместо имен файлов, доступных для чтения человеком, xml-дамп будет содержать двоичные данные в кодировке BASE64. Кроме того, XML-файлы дампа будут значительно больше, что затрудняет отладку любых проблем.
  • Так как содержимое файлов внедрено непосредственно в файл PRI, вы больше не можете переключить ресурсы на лету. Любое изменение в любом внедренном ресурсе потребует полного перестроения файла PRI. Так как ресурсы на основе файлов включают только имя файла, фактические файлы ресурсов можно обновлять в любое время.
  • Для упакованных приложений ресурсы изображений, перечисленные в AppXManifest , такие как значки меню "Пуск", не могут быть внедрены и должны быть указаны в качестве файловых ресурсов.

По этим причинам общее правило — использовать файловые ресурсы во время разработки внутреннего цикла, но рекомендуется использовать внедренные двоичные ресурсы для конечных рабочих сборок (за исключением ресурсов манифеста). Для упакованных приложений рекомендуется разместить ресурсы AppXManifest (например, значки меню "Пуск") в отдельном directoy от других ресурсов, чтобы упростить процесс сборки (ресурсы AppXManifest добавляются в виде файлов, а другие ресурсы добавляются как внедренные данные).