20 Eylül 2026 Pazar

Публикация десктопных игр MonoGame в Microsoft Store: Полное руководство по MSIX и WAP




Публикация десктопных игр MonoGame в Microsoft Store: Полное руководство по MSIX и WAP

Выпуск инди-игры в Microsoft Store на Windows 10 и Windows 11 открывает разработчикам прямой доступ к сотням миллионов игроков на ПК, автоматическим фоновым обновлениям, интеграции с Windows Game Bar и безопасности изолированной среды. Однако если ваша игра разработана на MonoGame (.NET 8.0 или .NET 9.0 WindowsDX), ее публикация требует архитектурного моста: объединения стандартного исполняемого файла Win32 (.exe) с современной моделью приложений MSIX / AppX.

В Arar Games мы успешно прошли этот путь от первой сборки до живой публикации с нашими играми Paint Trek и Blocked: Pixel Panzer. В этом руководстве мы разбираем весь процесс: настройку проектов, навигацию по меню Publish в Visual Studio, конфигурирование Package.appxmanifest, масштабирование графических тайлов, исправление ошибок Windows App Certification Kit (WACK) и отправку в Microsoft Partner Center.


1. Архитектурные основы: Win32 и MSIX

Классические игры на MonoGame компилируются в стандартный Win32 .exe, библиотеки среды выполнения (.dll) и каталог Content/ со сжатыми бинарными ресурсами (текстуры .xnb, звуки .ogg и шейдеры HLSL).

Обертывание игры в проект Windows Application Packaging (WAP) для создания пакета MSIX bundle дает важнейшие преимущества:

flowchart TD
    subgraph Solution
        Shared["Shared Library"]
        Desktop["Desktop Project (.NET 9.0 WindowsDX)"]
        Shared --> Desktop
    end

    subgraph Packaging
        WAP["Windows App Packaging (.wapproj)"]
        Manifest["Package.appxmanifest"]
        StoreAssoc["Package.StoreAssociation.xml"]
        Desktop --> WAP
        Manifest --> WAP
        StoreAssoc --> WAP
    end

    subgraph Distribution
        WAP --> Sideload["Sideloading Package (*.appxbundle)"]
        WAP --> UploadBundle["Store Bundle (*_bundle.appxupload)"]
        UploadBundle --> MSStore["Microsoft Partner Center"]
    end

Зачем упаковывать MonoGame через WAP?

  1. Изолированный жизненный цикл: Приложения MSIX запускаются в изолированном контейнере. При удалении все файлы и записи реестра стираются начисто, не оставляя мусора в системе.
  2. Динамическая доставка ресурсов: Единый пакет .appxupload объединяет сборки для архитектур x86 и x64 вместе с пакетами масштабирования графики (scale-100 до scale-400). Пользователь скачивает только те файлы, которые подходят его системе.
  3. Автоматическая телеметрия сбоев: Visual Studio упаковывает файлы символов отладки (.appxsym) в архив. При падении игры вы видите полный стек вызовов с номерами строк в Partner Center.

2. Структура и настройка проекта

В файле .csproj основного проекта укажите поддержку платформ и копирование ресурсов:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net9.0-windows</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
    <Platforms>AnyCPU;x64;x86</Platforms>
  </PropertyGroup>
  <ItemGroup>
    <Content Include="Content\**\*.*">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
</Project>

Восстановите пакеты NuGet для обеих архитектур:

dotnet restore YourGame.Desktop.csproj -r win-x64
dotnet restore YourGame.Desktop.csproj -r win-x86

3. Разбор меню Publish в Visual Studio

При правом клике на проект WAP в меню Publish доступны 3 пункта:

  1. Associate App with the Store...: Привязывает проект к зарегистрированному приложению в Partner Center, загружает официальные идентификаторы и генерирует Package.StoreAssociation.xml.
  2. Convert Content Group Map File: Инструмент потоковой установки (Streaming Install) для гигантских игр (50+ ГБ). Для инди-игр не требуется.
  3. Create App Packages...: Главный мастер для создания пакетов локального тестирования (Sideloading) или готового файла для Магазина (_bundle.appxupload).

4. Конфигурация мастера Create App Packages

  • Метод распространения: Выберите "Microsoft Store under a new or existing app name" для отправки в магазин или "Sideloading" для тестирования на своих ПК.
  • Архитектуры: Отметьте ☑️ x86 и ☑️ x64 (конфигурация Release).
  • Сборка бандла: Установите Generate app bundle: Always.
  • Правило версионирования: Номер версии (Major.Minor.Build.Revision, например 1.0.0.0). Каждая новая загрузка в Магазин обязана иметь номер версии выше предыдущей. Опция Automatically increment автоматически увеличивает номер ревизии.

5. Настройка Package.appxmanifest

Ключевые параметры манифеста:

  • <rescap:Capability Name="runFullTrust" />: Так как MonoGame использует DirectX 11 и нативные вызовы через SharpDX/SDL, этот параметр дает игре полные права рабочего стола в рамках чистого контейнера.
  • InitialRotationPreference="landscape": Блокирует альбомную ориентацию экрана, что критично для портативных ПК (ASUS ROG Ally, Lenovo Legion Go).

Warning

Значок экрана блокировки (BadgeLogo) должен состоять строго из белых пикселей (#FFFFFF) на прозрачном фоне. Наличие цветных пикселей приведет к ошибке контрастности в сертификационном тесте WACK.


7. Тестирование WACK и ошибки

  • Ошибка "AppCert.exe wasn't found": Установите компонент Windows App Certification Kit через Visual Studio Installer. Локальный тест опционален — облако Microsoft автоматически проверит пакет при отправке.
  • Ложные срабатывания (Blocked Executable): Сжатые файлы .xnb и .ogg могут случайно содержать сигнатуры PE-заголовков. Сертификация Microsoft распознает их как статические ресурсы игры и одобряет публикацию.

8. Локальное тестирование (Sideloading)

В папке AppPackages/YourGame_Test/ запустите PowerShell от имени администратора:

Set-ExecutionPolicy RemoteSigned -Scope Process
.\Add-AppDevPackage.ps1

Это установит тестовый сертификат и саму игру для проверки работы геймпадов, звука и стабильности 60 FPS.


9. Чек-лист отправки в Partner Center

  1. Pricing and availability: Выберите все рынки (240 стран) и базовую цену в долларах.
  2. Properties: Категория Games, ссылка на Политику конфиденциальности (Privacy Policy URL).
  3. Age ratings: Пройдите опрос IARC (аркадные игры получают Everyone / PEGI 3).
  4. Store listings: Загрузите скриншоты 1920x1080 без мобильных кнопок на экране.
  5. Packages: Загрузите файл _bundle.appxupload и нажмите Submit to the Store.

Заключение

Публикация игры на MonoGame в Microsoft Store не требует переписывания кода под UWP. Проект WAP, разрешение runFullTrust и гибридные сборки x86/x64 позволяют легко вывести ваш проект на глобальную аудиторию Windows!




Hiç yorum yok:

Yorum Gönder