Встраивать ресурсы в пакет приложения, а не в пакет ресурсов

Некоторые типы приложений (многоязычные словари, средства перевода и т. д.) должны переопределять поведение пакета приложений по умолчанию и встраивать ресурсы в пакет приложения, а не в отдельные пакеты ресурсов (или пакеты ресурсов). В этом разделе объясняется, как это сделать.

По умолчанию при создании пакета приложений (.appxbundle) в пакет приложения встроены только ресурсы по умолчанию для языка, масштабирования и уровня функций DirectX. Переведенные ресурсы и ресурсы, адаптированные для масштабирований, отличных от стандартных, и (или) уровней функций DirectX, встроены в пакеты ресурсов и скачиваются только на устройства, которым они нужны. Если клиент купит ваше приложение из Microsoft Store на устройстве, на котором в качестве предпочитаемого языка выбран испанский язык, скачиваются и устанавливаются только ваше приложение и пакет ресурсов на испанском языке. Если тот же пользователь позже изменит предпочитаемый язык на французский в параметрах, будет скачан и установлен ресурсов приложения на французском языке. То же происходит с ресурсами для масштабирования и функционального уровня DirectX. Для большинства приложений такое поведение является ценной эффективностью, и это то, что вы и клиент хотите сделать.

Но если приложение позволяет пользователю изменить язык в самом приложении (а не в параметрах), то это поведение по умолчанию не подходит. Вам необходимо, чтобы все языковые ресурсы скачивались и устанавливались в любом случае вместе с приложение один раз и затем оставались на устройстве. Вам следует встроить все эти ресурсы в пакет приложения, а не в отдельные пакеты.

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

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

Вариант 1. Использование файла priconfig.packaging.xml для добавления ресурсов в пакет приложения

  1. Добавьте новый элемент в проект в Visual Studio. Выберите XML-файл и укажите для него имя priconfig.packaging.xml.
  2. В обозревателе решений выберите priconfig.packaging.xml и откройте окно "Свойства". Параметру "Действие при сборке" файла должно быть задано значение "Нет", а параметру "Копировать в выходной каталог" — "Не копировать".
  3. Замените содержимое файла этим XML-кодом.
    <packaging>
       <autoResourcePackage qualifier="Language" />
       <autoResourcePackage qualifier="Scale" />
       <autoResourcePackage qualifier="DXFeatureLevel" />
    </packaging>
    
  4. Каждый элемент <autoResourcePackage> указывает Visual Studio, что необходимо автоматически разделить ресурсы для заданного имени квалификатора на отдельные пакеты ресурсов. Это называется автоматическим разделением. Текущее содержимое файла не меняет поведение Visual Studio. Другими словами, Visual Studio уже ведет себя так, как если бы этот файл присутствовал с этим содержимым, так как это значения по умолчанию. Если вы не хотите, чтобы Visual Studio автоматически разделял имя квалификатора, удалите этот <autoResourcePackage> элемент из файла. Вот как будет выглядеть файл, если вам требуется, чтобы все языковые ресурсы были встроены в пакет приложения, а не разделялись автоматически на отдельные пакеты ресурсов.
    <packaging>
       <autoResourcePackage qualifier="Scale" />
       <autoResourcePackage qualifier="DXFeatureLevel" />
    </packaging>
    
  5. Сохраните и закройте файл и заново выполните построение проекта.

Чтобы убедиться, что выбранные параметры автоматического разделения учитываются, изучите файл <ProjectFolder>\obj\<ReleaseConfiguration folder>\split.priconfig.xml и убедитесь, что его содержимое соответствует выбранным параметрам. Если это так, вы успешно настроили Visual Studio для добавления выбранных ресурсов в пакет приложения.

Вам остался один последний шаг. Но только в том случае, если вы удалили имя квалификатора Language. Необходимо указать объединение всех поддерживаемых языков приложения в качестве языка по умолчанию. Дополнительные сведения см. в разделе Указание ресурсов по умолчанию, которые используются в приложении. Вот что будет содержать файл priconfig.default.xml, если в пакет приложения добавлены ресурсы для английского, испанского и французского языка.

   <default>
      <qualifier name="Language" value="en;es;fr" />
      ...
   </default>

Как это работает?

Visual Studio запускает средство MakePri.exe в фоновом режиме для создания файла, который называют индексом ресурсов пакета, описывающий все ресурсы вашего приложения, в том числе имена квалификаторов ресурсов для автоматического разбиения. Сведения об этом средстве см. в разделе Компиляция ресурсов вручную с помощью MakePri.exe. Visual Studio передает файл конфигурации MakePri.exe. Содержимое файла priconfig.packaging.xml используется в качестве элемента <packaging> этого файла конфигурации, который определяет автоматическое разделение. Таким образом, добавление и изменение priconfig.packaging.xml влияет на содержимое файла индекса ресурсов пакетов, который Visual Studio создает для вашего приложения, а также на содержимое пакетов приложения.

Использование имени, отличного от priconfig.packaging.xml

Если назвать файл priconfig.packaging.xml, Visual Studio распознает его и будет использовать его автоматически. Если указать другое имя, необходимо сообщить об этом Visual Studio. Добавьте этот XML-код в файл проекта между открывающим и закрывающим тегами первого элемента <PropertyGroup>.

<AppxPriConfigXmlPackagingSnippetPath>FILE-PATH-AND-NAME</AppxPriConfigXmlPackagingSnippetPath>

Замените FILE-PATH-AND-NAME на путь к файлу и его имя.

Вариант 2. Использование файла проекта для добавления ресурсов в пакет приложения

Это альтернатива варианту 1. После того как вы поймете, как работает вариант 1, вы можете выбрать вариант 2, если это лучше подходит для вашего рабочего процесса разработки и (или) сборки.

Добавьте этот XML-код в файл проекта между открывающим и закрывающим тегами первого элемента <PropertyGroup>.

<AppxBundleAutoResourcePackageQualifiers>Language|Scale|DXFeatureLevel</AppxBundleAutoResourcePackageQualifiers>

Вот как это выглядит после удаления первого имени квалификатора.

<AppxBundleAutoResourcePackageQualifiers>Scale|DXFeatureLevel</AppxBundleAutoResourcePackageQualifiers>

Сохраните и закройте файл и заново выполните построение проекта.

Вам остался один последний шаг. Но только в том случае, если вы удалили имя квалификатора Language. Необходимо указать объединение всех поддерживаемых языков приложения в качестве языка по умолчанию. Дополнительные сведения см. в разделе Указание ресурсов по умолчанию, которые используются в приложении. Это то, что будет содержать файл проекта, если вы включили ресурсы для английского, испанского и французского языков в пакет приложения.

<AppxDefaultResourceQualifiers>Language=en;es;fr</AppxDefaultResourceQualifiers>