20 Eylül 2026 Pazar

نشر ألعاب سطح المكتب MonoGame على Microsoft Store: الدليل الكامل لـ MSIX و WAP

نشر ألعاب سطح المكتب MonoGame على Microsoft Store: الدليل الكامل لـ MSIX و WAP

يتيح إطلاق لعبة مستقلة على Microsoft Store في Windows 10 و Windows 11 للمطورين وصولاً مباشراً إلى مئات الملايين من لاعبي الحواسيب، إلى جانب التحديثات التلقائية الخلفية، والتكامل مع شريط ألعاب Windows، وأمان بيئة التثبيت المعزولة. ومع ذلك، إذا كانت لعبتك مبنية باستخدام 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 (WACK)، والتقديم النهائي عبر Microsoft Partner Center.


1. الأسس المعمارية: مقارنة بين Win32 و MSIX

تُبنى ألعاب MonoGame التقليدية كملف تنفيذي قياسي بنظام Win32 مصحوباً بمكتبات وقت التشغيل (.dll) ومجلد Content/ يحتوي على الأصول الثنائية المضغوطة (خامات .xnb، ملفات صوت .ogg، ومظللات HLSL).

على الرغم من أن متجر مايكروسوفت يدعم حالياً توزيع ملفات Win32 التنفيذية المنفصلة، إلا أن تغليف لعبتك ضمن مشروع حزم تطبيقات Windows (WAP) لإنتاج حزمة MSIX bundle يوفر فوائد تقنية وعملية هائلة:

flowchart TD
    subgraph "قاعدة كود اللعبة"
        Shared["المكتبة المشتركة
(الميكانيكا، الأنظمة، حالة اللعبة)"]
        Desktop["مشروع سطح المكتب (.NET 9.0 WindowsDX)
(نقطة الدخول Win32 Executable)"]
        Shared --> Desktop
    end

    subgraph "طبقة الحزم (مشروع WAP)"
        WAP["حزم تطبيقات Windows (.wapproj)
(Microsoft Desktop Bridge)"]
        Manifest["Package.appxmanifest
(الهوية، الصلاحيات، العناصر المرئية)"]
        StoreAssoc["Package.StoreAssociation.xml
(الربط بـ Partner Center)"]
        Desktop --> WAP
        Manifest --> WAP
        StoreAssoc --> WAP
    end

    subgraph "المخرجات والتوزيع"
        WAP -->|إنشاء الحزم| Sideload["حزمة التحميل الجانبي
(*.appxbundle + Add-AppDevPackage.ps1)"]
        WAP -->|نمط المتجر| UploadBundle["حزمة رفع المتجر
(*_bundle.appxupload / *.msixupload)"]
        UploadBundle --> MSStore["Microsoft Partner Center
(النشر المباشر في المتجر)"]
    end

لماذا نغلف مشروع MonoGame بواسطة WAP؟

  1. دورة حياة معزولة داخل حاوية: تعمل تطبيقات MSIX في بيئة معزولة وآمنة. عند إلغاء التثبيت، تُحذف كافة الملفات ومدخلات السجل الافتراضية دون ترك أي مخلفات على النظام.
  2. توزيع ديناميكي وحجم أصغر: تجمع حزمة .appxupload واحدة بين ثنائيات معماريات x86 و x64 مع حزم مقاييس الشاشة المتعددة (scale-100 حتى scale-400). يرسل المتجر للجهاز فقط المعمارية والأصول التي تناسبه.
  3. تقارير الأعطال التلقائية: يُضمن Visual Studio ملفات رموز التصحيح (.appxsym) داخل حزمة الرفع، مما يتيح لك رؤية تفاصيل تتبع الأعطال (stack trace) بدقة في لوحة تحكم Partner Center.

2. الهيكل التنظيمي للمشروع والتهيئة

SolutionDir/
│
├── YourGame.Shared/               # المنطق الأساسي للعبة، المراحل والأنظمة (مكتبة مشتركة)
│   └── YourGame.Shared.csproj
│
├── YourGame.Desktop/              # نقطة تشغيل سطح المكتب (WinExe)
│   ├── Content/                   # أصول خط معالجة المحتوى (.mgcb -> .xnb)
│   ├── Program.cs
│   └── YourGame.Desktop.csproj
│
└── YourGame.Package/              # مشروع حزم WAP (.wapproj)
    ├── Images/                    # الأيقونات والشعارات وشاشة البدء
    ├── Package.appxmanifest       # إعلان الهوية والصلاحيات
    ├── Package.StoreAssociation.xml
    └── YourGame.Package.wapproj

الخطوة 1: تهيئة مشروع اللعبة الرئيسي (.csproj)

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net9.0-windows</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
    <ApplicationHighDpiMode>PerMonitorV2</ApplicationHighDpiMode>
    <Platforms>AnyCPU;x64;x86</Platforms>
  </PropertyGroup>

  <!-- ضمان نسخ أصول اللعبة أثناء الحزم -->
  <ItemGroup>
    <Content Include="Content\**\*.*">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="MonoGame.Framework.WindowsDX" Version="3.8.*" />
    <PackageReference Include="MonoGame.Content.Builder.Task" Version="3.8.*" />
  </ItemGroup>
</Project>

الخطوة 2: استعادة حزم NuGet لكلا المعماريتين

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

3. خيارات قائمة Publish في Visual Studio

عند النقر بزر الفأرة الأيمن على مشروع WAP واختيار Publish، تظهر ثلاثة خيارات:

  1. Associate App with the Store... (ربط التطبيق بالمتجر): تسجيل الدخول بحساب المطور وربط المشروع باسم التطبيق المحجوز في Partner Center لجلب معرّف الناشر الرسمي وتوليد ملف Package.StoreAssociation.xml.
  2. Convert Content Group Map File (تحويل ملف خريطة مجموعات المحتوى): يُستخدم في الألعاب الضخمة (أكثر من 50 جيجابايت) لدعم تقنية التثبيت التدريجي (Streaming Install)؛ يمكن للألعاب المستقلة العادية تجاهل هذا الخيار بأمان.
  3. Create App Packages... (إنشاء حزم التطبيق): المعالج الرئيسي لبناء وتوقيع الحزم سواء للاختبار المحلي (Sideloading) أو لإنشاء حزمة الرفع للمتجر (_bundle.appxupload).

4. تكوين معالج إنشاء الحزم (Create App Packages)

┌─────────────────────────────────────────────────────────────┐
│ Output location: .\AppPackages\                             │
│ Version: 1.0.0.0      [☑ Automatically increment]           │
│                                                             │
│ Generate app bundle: Always                                 │
│                                                             │
│ المعماريات:                                                  │
│   ☑ x86       التهيئة: Release (x86)                        │
│   ☑ x64       التهيئة: Release (x64)                        │
│   ☐ ARM       (غير موصى به لألعاب Win32 لسطح المكتب)         │
│   ☐ ARM64     (غير موصى به لألعاب Win32 لسطح المكتب)         │
│                                                             │
│ الخيارات:                                                   │
│   ☑ Include public symbol files                             │
│   ☑ Generate artifacts to validate app with WACK            │
└─────────────────────────────────────────────────────────────┘
  • قاعدة إصدارات المتجر: يتبع ترقيم الإصدارات النمط Major.Minor.Build.Revision، ويجب أن يكون رقم إصدار أي حزمة جديدة يُرفع إلى المتجر أعلى دائماً من الإصدار المعروض حالياً.
  • تفعيل خيار Automatically increment يرفع رقم المراجعة (Revision) تلقائياً مع كل بناء لمنع تعارض أرقام الإصدارات.

5. ضبط ملف Package.appxmanifest

<?xml version="1.0" encoding="utf-8"?>
<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  IgnorableNamespaces="uap rescap">

  <Identity
    Name="YourPublisher.YourGame"
    Publisher="CN=YOUR-OFFICIAL-PUBLISHER-ID"
    Version="1.0.0.0" />

  <Properties>
    <DisplayName>اسم لعبتك</DisplayName>
    <PublisherDisplayName>اسم الاستوديو</PublisherDisplayName>
    <Logo>Images\StoreLogo.png</Logo>
  </Properties>

  <Dependencies>
    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.26100.0" />
  </Dependencies>

  <Applications>
    <Application Id="App"
      Executable="$targetnametoken$.exe"
      EntryPoint="$targetentrypoint$">
      <uap:VisualElements
        DisplayName="اسم لعبتك"
        Description="لعبة إطلاق نار ثنائية الأبعاد مبنية بواسطة MonoGame."
        BackgroundColor="transparent"
        Square150x150Logo="Images\Square150x150Logo.png"
        Square44x44Logo="Images\Square44x44Logo.png">
        <uap:DefaultTile 
          Wide310x150Logo="Images\Wide310x150Logo.png"  
          Square71x71Logo="Images\SmallTile.png" 
          Square310x310Logo="Images\LargeTile.png" />
        <uap:SplashScreen Image="Images\SplashScreen.png" />
        <uap:LockScreen BadgeLogo="Images\BadgeLogo.png" Notification="badgeAndTileText"/>
        <uap:InitialRotationPreference>
          <uap:Rotation Preference="landscape"/>
        </uap:InitialRotationPreference>
      </uap:VisualElements>
    </Application>
  </Applications>

  <Capabilities>
    <Capability Name="internetClient" />
    <rescap:Capability Name="runFullTrust" />
  </Capabilities>
</Package>

نقاط أساسية:

  • صلاحية <rescap:Capability Name="runFullTrust" />: نظراً لأن MonoGame يعتمد على مكتبات DirectX 11 ومكتبات محلية، فإنه يحتاج إلى صلاحية سطح المكتب الكاملة ليعمل بشكل سليم داخل الحاوية.
  • قفل اتجاه الشاشة InitialRotationPreference على landscape: يضمن تشغيل اللعبة بالوضع الأفقي على الأجهزة المحمولة مثل ASUS ROG Ally و Lenovo Legion Go.

Warning

شرط BadgeLogo الصارم: يجب أن يتكون شعار شاشة القفل (BadgeLogo) حصراً من بكسلات بيضاء ناصعة (#FFFFFF) وخلفية شفافة. وجود ألوان أو تدرجات يؤدي لرسوب الفحص في WACK.


7. فحص WACK واستكشاف الأخطاء

  • خطأ "AppCert.exe wasn't found": يتم تثبيت أداة فحص الاعتماد عبر Visual Studio Installer من تبويب المكونات المستقلة (Individual components) بالبحث عن "Windows App Certification Kit". مع العلم أن تشغيل الاختبار محلياً اختياري؛ فالمتجر ينفذ الفحص تلقائياً عند الرفع.
  • تحذير "Blocked Executable" لأصول MonoGame: يرجع لتشابه عشوائي بين بايتات الملفات المضغوطة وترويسات PE. تعترف مايكروسوفت بها كأصول لعب ثابتة وتوافق عليها دون مشاكل.

8. الاختبار المحلي عبر التحميل الجانبي (Sideloading)

من مجلد AppPackages/YourGame_1.0.0.0_Test/، افتح PowerShell كمسؤول ونفّذ:

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

لتثبيت اللعبة محلياً والتأكد من دعم وحدات التحكم والصوت والأداء.


9. قائمة مراجعة التقديم في Microsoft Partner Center

  1. التسعير والتوفر: اختيار كافة الأسواق العالمية (240 دولة) وتحديد السعر بالدولار.
  2. الخصائص وسياسة الخصوصية: تصنيف اللعبة تحت Games وإضافة رابط سياسة الخصوصية (Privacy Policy).
  3. التقييم العمري (IARC): إكمال الاستبيان (تحصل ألعاب الأركيد عادة على تصنيف Everyone / PEGI 3).
  4. اللقطات والوصف: رفع لقطات شاشة 1920x1080 لسطح المكتب بدون أزرار لمس الموبايل.
  5. رفع الحزمة: سحب وإفلات ملف _bundle.appxupload ثم الضغط على Submit to the Store.

الخلاصة

نشر ألعاب MonoGame على Microsoft Store لا يتطلب التخلي عن إمكانيات .NET 9 أو إعادة كتابة الألعاب لنظام UWP. بفضل مشاريع WAP وحزم MSIX، يمكنك تقديم لعبتك لملايين اللاعبين بأعلى درجات الاحترافية والأمان!

Публикация десктопных игр 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!

Pubblicazione di giochi desktop MonoGame su Microsoft Store: Guida completa a MSIX e WAP

Pubblicazione di giochi desktop MonoGame su Microsoft Store: Guida completa a MSIX e WAP

Pubblicare un gioco indipendente su Microsoft Store in Windows 10 e Windows 11 garantisce agli sviluppatori l'accesso a centinaia di milioni di giocatori PC, aggiornamenti automatici in background, integrazione con Windows Game Bar e la sicurezza di un'installazione isolata. Tuttavia, se il gioco è sviluppato con MonoGame (.NET 8.0 o .NET 9.0 WindowsDX), l'approdo sullo store richiede un ponte architetturale: collegare un comune eseguibile Win32 (.exe) al moderno modello di applicazioni MSIX / AppX.

Noi di Arar Games abbiamo affrontato questo percorso con titoli come Paint Trek e Blocked: Pixel Panzer, dalla compilazione iniziale fino alla pubblicazione finale. In questa guida tecnica esaminiamo l'intera pipeline: configurazione dei progetti, gestione delle opzioni del menu Publish in Visual Studio, configurazione del Package.appxmanifest, scalabilità delle immagini dei tile, gestione degli errori WACK e invio a Microsoft Partner Center.


1. Fondamenti architetturali: Win32 e MSIX a confronto

I giochi MonoGame tradizionali vengono compilati come normali eseguibili Win32 accompagnati da librerie di runtime (.dll) e da una directory Content/ contenente risorse binarie compresse (texture .xnb, audio .ogg, shader HLSL).

L'incapsulamento del gioco all'interno di un progetto Windows Application Packaging (WAP) per generare un MSIX bundle offre vantaggi fondamentali:

  1. Ciclo di vita isolato in container: Le applicazioni MSIX girano in un ambiente protetto. Durante la disinstallazione, tutti i file e le chiavi di registro virtualizzate vengono rimossi senza lasciare residui nel sistema operativo.
  2. Distribuzione dinamica e peso ridotto: Un unico pacchetto .appxupload racchiude i binari per x86 e x64 e i set di risorse per le diverse risoluzioni DPI (scale-100 fino a scale-400). Gli utenti scaricano solo i file necessari per la propria macchina.
  3. Telemetria automatica degli arresti anomali: Visual Studio include i simboli di debug (.appxsym). In caso di crash, il pannello di Partner Center mostra lo stack trace completo con i numeri di riga e i nomi dei metodi.

2. Configurazione del progetto

Nel file .csproj del progetto principale di gioco, abilita il supporto multipiattaforma e la copia dei contenuti:

<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>

Ripristino dei pacchetti NuGet:

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

3. Le opzioni del menu Publish di Visual Studio

Facendo clic con il tasto destro sul progetto WAP e selezionando Publish, si hanno a disposizione 3 opzioni:

  1. Associate App with the Store...: Associa il progetto all'applicazione riservata nel Partner Center, recupera il Publisher ID ufficiale e genera Package.StoreAssociation.xml.
  2. Convert Content Group Map File: Strumento per installazioni in streaming per giochi enormi (+50 GB). Non necessario per giochi indie.
  3. Create App Packages...: La procedura guidata principale per creare pacchetti di test locale (Sideloading) o il bundle definitivo per lo Store (_bundle.appxupload).

4. Configurazione della procedura guidata di creazione pacchetti

  • Metodo di distribuzione: Seleziona "Microsoft Store under a new or existing app name" per lo store oppure "Sideloading" per i test interni.
  • Architetture: Spunta ☑️ x86 e ☑️ x64 in configurazione Release.
  • Creazione bundle: Generate app bundle: Always.
  • Regola di controllo delle versioni: Formato Major.Minor.Build.Revision (es. 1.0.0.0). Ogni nuovo pacchetto caricato deve avere un numero di versione superiore a quello attualmente attivo sullo Store. La spunta su Automatically increment aumenta automaticamente la revisione a ogni build.

5. Configurazione fondamentale di Package.appxmanifest

  • <rescap:Capability Name="runFullTrust" />: Poiché MonoGame richiede DirectX 11 e chiamate native Win32, questo permesso assicura l'esecuzione completa su desktop all'interno del container MSIX.
  • InitialRotationPreference="landscape": Blocca l'orientamento orizzontale, essenziale per dispositivi portatili da gioco con Windows (ASUS ROG Ally, Lenovo Legion Go).

Warning

Regola tassativa per BadgeLogo: L'icona per la schermata di blocco (BadgeLogo) deve essere formata esclusivamente da pixel bianchi puri (#FFFFFF) su sfondo trasparente. L'uso di colori o gradienti provocherà la bocciatura del test di contrasto in WACK.


7. Verifica WACK e risoluzione problemi

  • Errore "AppCert.exe wasn't found": Installa il Windows App Certification Kit tramite Visual Studio Installer. Il test locale è facoltativo: Microsoft esegue la certificazione automaticamente nei propri server cloud durante il caricamento.
  • Falsi positivi nei file MonoGame: I file binari compressi .xnb o .ogg possono accidentalmente somigliare a header eseguibili. La certificazione di Microsoft li identifica regolarmente come asset statici e autorizza la pubblicazione.

8. Test locale tramite Sideloading

Nella cartella AppPackages/YourGame_Test/, apri PowerShell come amministratore ed esegui:

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

9. Checklist finale per Microsoft Partner Center

  1. Prezzo e disponibilità: Seleziona tutti i 240 mercati e fissa il prezzo base in USD.
  2. Proprietà: Assegna la categoria Games e inserisci l'URL dell'Informativa sulla privacy.
  3. Classificazione per età (IARC): Compila il questionario (i giochi arcade ottengono solitamente Everyone / PEGI 3).
  4. Scheda dello Store: Carica screenshot di gioco per PC a 1920x1080 (senza levette touch per cellulari).
  5. Pacchetti: Carica il file _bundle.appxupload e fai clic su Submit to the Store.

Veröffentlichung von MonoGame-Desktop-Spielen im Microsoft Store: Der vollständige MSIX- und WAP-Leitfaden

Veröffentlichung von MonoGame-Desktop-Spielen im Microsoft Store: Der vollständige MSIX- und WAP-Leitfaden

Die Veröffentlichung eines Indie-Spiels im Microsoft Store unter Windows 10 und Windows 11 bietet Entwicklern direkten Zugang zu Hunderten Millionen PC-Spielern, automatische Hintergrund-Updates, Integration in die Windows Game Bar und die Sicherheit einer isolierten Container-Installation. Wenn Ihr Spiel jedoch mit MonoGame (.NET 8.0 oder .NET 9.0 WindowsDX) entwickelt wurde, erfordert die Store-Bereitstellung eine architektonische Brücke: die Verbindung einer klassischen Win32-Desktop-Executable (.exe) mit dem modernen MSIX / AppX-Anwendungsmodell.

Bei Arar Games haben wir diesen Weg mit Titeln wie Paint Trek und Blocked: Pixel Panzer von der ersten Kompilierung bis zur weltweiten Veröffentlichung gemeistert. In diesem technischen Leitfaden erläutern wir die gesamte Pipeline: Projektkonfiguration, Beherrschung der Visual Studio Publish-Optionen, Konfiguration der Package.appxmanifest, Skalierung von Kachelgrafiken, Behebung von WACK-Validierungsfehlern und Einreichung im Microsoft Partner Center.


1. Architektonische Grundlagen: Win32 vs. MSIX

Klassische MonoGame-Spiele kompilieren in eine Win32-Anwendung mit Laufzeitbibliotheken (.dll) und einem Content/-Ordner mit komprimierten Binärressourcen (.xnb-Texturen, .ogg-Audiodateien, Shaders).

Die Kapselung des Spiels in einem Windows Application Packaging (WAP)-Projekt zur Erstellung eines MSIX bundle bietet signifikante Vorteile:

  1. Isolierter Container-Lebenszyklus: MSIX-Anwendungen laufen in einer isolierten Umgebung. Bei der Deinstallation werden alle Dateien und virtualisierten Registry-Einträge rückstandslos entfernt.
  2. Dynamische Architektur- & Ressourcenbereitstellung: Ein einziges .appxupload-Paket bündelt x86- und x64-Binärdateien sowie mehrere DPI-Skalierungspakete (scale-100 bis scale-400). Spieler laden nur die für ihr Gerät passenden Daten herunter.
  3. Automatische Absturztelemetrie: Visual Studio packt Debug-Symbole (.appxsym) in das Paket. Bei Abstürzen zeigt das Partner Center-Dashboard den vollständigen Stacktrace mit Zeilennummern an.

2. Projektstruktur und Konfiguration

In der .csproj-Datei des Hauptspiels Multi-Plattform-Unterstützung und Ressourcenkopie konfigurieren:

<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-Pakete wiederherstellen:

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

3. Das Visual Studio Publish-Menü im Detail

Beim Rechtsklick auf das WAP-Projekt und Auswahl von Publish stehen drei Optionen bereit:

  1. Associate App with the Store...: Verbindet das Projekt mit dem Entwicklerkonto, bezieht offizielle IDs und erstellt Package.StoreAssociation.xml.
  2. Convert Content Group Map File: Werkzeug für Streaming-Installationen bei riesigen Spielen (50+ GB). Für Indie-Spiele nicht erforderlich.
  3. Create App Packages...: Der Hauptassistent zur Erstellung von Testpaketen (Sideloading) oder des finalen Store-Bundles (_bundle.appxupload).

4. Konfiguration des Paketierungsassistenten

  • Vertriebsmethode: "Microsoft Store under a new or existing app name" für den Store, "Sideloading" für lokale Tests.
  • Architekturen: ☑️ x86 und ☑️ x64 auswählen (Release-Konfiguration).
  • Bundle-Einstellung: Generate app bundle: Always.
  • Versionsregel: Major.Minor.Build.Revision (z. B. 1.0.0.0). Jedes neue Paket im Partner Center muss eine höhere Versionsnummer als das aktive Store-Paket aufweisen. Automatically increment erhöht bei jedem Build automatisch die Revision.

5. Konfiguration der Package.appxmanifest

  • <rescap:Capability Name="runFullTrust" />: MonoGame benötigt vollen Desktop-Zugriff für DirectX 11 und SharpDX/SDL, behält dabei aber die saubere Container-Installation bei.
  • InitialRotationPreference="landscape": Fixiert das Querformat, essenziell für Windows-Gaming-Handhelds (ASUS ROG Ally, Lenovo Legion Go).

6. Grafik-Assets und die BadgeLogo-Vorschrift

Warning

Strikte BadgeLogo-Vorgabe: Das Sperrbildschirm-Symbol (BadgeLogo) darf ausschließlich aus rein weißen Pixeln (#FFFFFF) und Transparenz bestehen. Farbige Pixel führen zu Kontrastfehlern im WACK-Test.


7. WACK-Prüfung und Fehlerbehebung

  • Fehler "AppCert.exe wasn't found": Installieren Sie das Windows App Certification Kit über den Visual Studio Installer. Der lokale Test ist optional, da Microsoft die Prüfung beim Upload in der Cloud vornimmt.
  • Fehlalarm bei MonoGame-Dateien (Blocked Executable): Komprimierte .xnb- oder .ogg-Dateien können zufällig Signaturen von PE-Headern aufweisen. Das Store-Team erkennt sie als statische Spieldaten an.

8. Lokales Testen via Sideloading

Im Ordner AppPackages/YourGame_Test/ PowerShell als Administrator öffnen und ausführen:

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

9. Microsoft Partner Center Checkliste

  1. Preise & Verfügbarkeit: Alle 240 Märkte auswählen und Basispreis in USD festlegen.
  2. Eigenschaften: Kategorie Games zuweisen und Datenschutzerklärung (Privacy Policy URL) hinterlegen.
  3. Altersfreigabe (IARC): Fragebogen ausfüllen (Arcade-Spiele erhalten meist Everyone / PEGI 3).
  4. Store-Eintrag: 1920x1080 PC-Screenshots ohne mobile Touch-Steuerungselemente hochladen.
  5. Pakete: _bundle.appxupload hochladen und auf Submit to the Store klicken.

MonoGame デスクトップゲームを Microsoft Store に公開する:完全な MSIX および WAP ガイド

MonoGame デスクトップゲームを Microsoft Store に公開する:完全な MSIX および WAP ガイド

Windows 10 および Windows 11 の Microsoft Store にインディーゲームを公開することは、世界中の何億人もの PC ゲーマーへの直接的なアクセス、バックグラウンドでの自動アップデート、Windows Game Bar との統合、コンテナ化されたインストール環境による安全性をもたらします。しかし、ゲームが MonoGame(.NET 8.0 または .NET 9.0 WindowsDX)で構築されている場合、ストアへの配信には伝統的な Win32 実行ファイル(.exe)を最新の MSIX / AppX アプリケーションモデルへ橋渡しするアーキテクチャが必要です。

Arar Games では、Paint Trek および Blocked: Pixel Panzer の開発を通じて、初期ビルドからストアでの本番公開に至るまでの全プロセスを確立しました。本ガイドでは、プロジェクトの構成、Visual Studio の Publish メニューオプションの理解、Package.appxmanifest の設定、タイルアセットの解像度スケーリング、Windows アプリ認定キット(WACK)の検証対応、そして Microsoft Partner Center への提出に至る実践的なノウハウを徹底解説します。


1. アーキテクチャの基礎:Win32 と MSIX の比較

MonoGame ゲームは通常、Win32 実行可能ファイル、ランタイムライブラリ(.dll)、およびコンパイル済みコンテンツ(.xnb テクスチャ、.ogg 音声、シェーダー)を含む Content/ フォルダとしてビルドされます。

Windows アプリケーション パッケージ化(WAP) プロジェクトを使用してゲームを MSIX bundle にカプセル化することで、以下のメリットが得られます:

  1. 分離された安全なライフサイクル: MSIX アプリケーションは分離されたコンテナ環境で実行されます。アンインストール時にはすべてのファイルとレジストリ項目が完全に削除され、OS 内にゴミを残しません。
  2. 動的なアーキテクチャとアセット配信: 1 つの .appxupload パッケージに x86x64 の両方のバイナリおよび各 DPI スケール(scale-100scale-400)が含まれます。ストアはユーザーの PC に必要なファイルのみをダウンロードさせるため、容量を大幅に節約できます。
  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. Visual Studio の Publish メニューの解説

WAP プロジェクトを右クリックして Publish を開くと、以下の 3 つの選択肢が表示されます:

  1. Associate App with the Store...(アプリをストアに関連付ける): パートナーセンターで予約したアプリ名を選択して公式 Publisher ID を取得し、Package.StoreAssociation.xml を自動生成します。
  2. Convert Content Group Map File(コンテンツグループ マップファイルの変換): 50GB を超える巨大ゲームのストリーミング分割インストール用です。インディーゲームでは不要です。
  3. Create App Packages...(アプリ パッケージの作成): ローカル実機テスト(Sideloading)やストア提出用アーカイブ(_bundle.appxupload)を出力するメインウィザードです。

4. パッケージ作成ウィザードの設定

  • 配布方法: ストア提出時は "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 やネイティブ API を使用するため、この設定でコンテナ内での完全なデスクトップ実行権限を付与します。
  • InitialRotationPreference="landscape": ROG Ally などのポータブル Windows ゲーミング端末向けに横画面を固定します。

Warning

BadgeLogo の絶対規則: ロック画面用アイコン(BadgeLogo)は、純白(#FFFFFF)ピクセルと透明ピクセルのみで構成されている必要があります。カラーピクセルが含まれていると WACK のコントラスト検証で失格となります。


7. WACK 検証とトラブルシューティング

  • "AppCert.exe wasn't found" エラー: Visual Studio Installer の「個別のコンポーネント」から「Windows アプリ認定キット」をインストールしてください。なおローカルでの WACK 実行は任意であり、ストアへ提出時にマイクロソフトのクラウド上で自動検証されます。
  • MonoGame アセットの誤検知: 圧縮された .xnb.ogg のバイト配列が実行ヘッダーと誤認されることがありますが、コンテンツフォルダ内の静的ファイルとして正常に承認されます。

8. サイドローディングによるローカル検証

AppPackages/YourGame_Test/ にて PowerShell を管理者権限で起動し、以下を実行します:

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

実機でのゲームパッド動作や 60FPS の描画安定性を確認できます。


9. Microsoft Partner Center 提出チェックリスト

  1. Pricing and availability: 全 240 市場を選択し、米ドルで基準価格を設定(現地通貨へ自動換算)。
  2. Properties: カテゴリを Games に指定し、プライバシーポリシー URL を入力。
  3. Age ratings: IARC 質問票に回答(アーケードゲームは通常 Everyone / PEGI 3 を即時取得)。
  4. Store listings: 1920x1080 の PC プレイ画面スクリーンショットを登録。
  5. Packages: _bundle.appxupload をアップロードして Submit to the Store をクリック。

MonoGame 데스크톱 게임을 Microsoft Store에 게시하기: 완전한 MSIX 및 WAP 가이드

MonoGame 데스크톱 게임을 Microsoft Store에 게시하기: 완전한 MSIX 및 WAP 가이드

인디 게임을 Windows 10 및 Windows 11의 Microsoft Store에 출시하면 전 세계 수억 명의 PC 게이머에게 직접 도달할 수 있으며, 백그라운드 자동 업데이트, Windows Game Bar 통합, 샌드박스형 컨테이너 설치의 보안성을 누릴 수 있습니다. 그러나 게임이 MonoGame(.NET 8.0 또는 .NET 9.0 WindowsDX)으로 제작된 경우, 기존 Win32 실행 파일(.exe)을 현대적인 MSIX / AppX 애플리케이션 모델과 연결하는 아키텍처 파이프라인이 필요합니다.

Arar GamesPaint TrekBlocked: Pixel Panzer 출시를 통해 초기 컴파일부터 스토어 라이브 배포까지의 모든 과정을 성공적으로 구축했습니다. 본 가이드에서는 프로젝트 구성, Visual Studio의 Publish 메뉴 옵션 분석, Package.appxmanifest 작성, 타일 그래픽 스케일링, WACK 인증 오류 해결 및 Microsoft Partner Center 최종 제출까지의 전체 프로세스를 상세히 다룹니다.


1. 아키텍처 기반: Win32 vs MSIX

전통적인 MonoGame 게임은 표준 Win32 .exe, 런타임 라이브러리(.dll) 및 컴파일된 바이너리 에셋(.xnb 텍스처, .ogg 오디오, 셰이더)이 포함된 Content/ 폴더로 빌드됩니다.

Windows 애플리케이션 패키징(WAP) 프로젝트를 통해 게임을 MSIX bundle로 캡슐화하면 다음과 같은 핵심 이점을 얻을 수 있습니다:

  1. 격리된 컨테이너 라이프사이클: MSIX 앱은 격리된 가상 환경에서 실행되므로, 프로그램 삭제 시 모든 파일과 가상 레지스트리가 시스템에 찌꺼기를 남기지 않고 완벽하게 제거됩니다.
  2. 동적 아키텍처 및 리소스 전달: 단일 .appxupload 패키지에 x86x64 바이너리와 다양한 화면 배율(scale-100~scale-400)이 함께 번들링되어, 사용자 PC 사양에 맞는 파일만 다운로드되므로 다운로드 크기가 획기적으로 줄어듭니다.
  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. Visual Studio Publish 메뉴 상세 분석

WAP 프로젝트 우클릭 후 Publish 선택 시 제공되는 3가지 옵션:

  1. Associate App with the Store... (스토어와 앱 연결): 파트너 센터에 예약된 게임명을 선택하여 공식 Publisher ID와 패밀리 네임을 가져오고 Package.StoreAssociation.xml을 자동 생성합니다.
  2. Convert Content Group Map File (콘텐츠 그룹 맵 파일 변환): 대용량 게임(50GB 이상)의 스트리밍 분할 설치용 기능입니다. 인디 게임은 안전하게 건너뛰어도 됩니다.
  3. Create App Packages... (앱 패키지 만들기): 로컬 QA 테스트(Sideloading) 또는 스토어 업로드용 패키지(_bundle.appxupload)를 빌드하는 핵심 도구입니다.

4. 패키지 생성 마법사 설정

  • 배포 방식: 스토어 제출은 "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 및 네이티브 하드웨어 후킹을 사용하므로, 샌드박스 제한 없이 실행될 수 있도록 데스크톱 전체 권한을 부여합니다.
  • InitialRotationPreference="landscape": ASUS ROG Ally, Lenovo Legion Go 등 휴대용 Windows 게이밍 UMPC를 위해 가로 모드로 화면을 고정합니다.

Warning

BadgeLogo 엄격 규칙: 잠금 화면 뱃지 아이콘(BadgeLogo)은 반드시 순백색(#FFFFFF) 픽셀과 투명 배경으로만 구성되어야 합니다. 색상 픽셀이 포함되면 WACK 명암비 검사에서 거부됩니다.


7. WACK 검증 및 문제 해결

  • "AppCert.exe wasn't found" 오류: Visual Studio Installer의 개별 구성 요소 탭에서 "Windows App Certification Kit"을 설치하십시오. 로컬 검사는 선택 사항이며, 스토어 업로드 시 마이크로소프트 클라우드에서 자동으로 전체 검사를 수행합니다.
  • MonoGame 바이너리 오탐 (Blocked Executable): 압축된 .xnb.ogg 데이터가 실행 파일 시그니처와 우연히 일치하여 경고가 뜰 수 있으나, 정적 게임 콘텐츠로 정상 승인됩니다.

8. 로컬 사이드로딩 테스트

AppPackages/YourGame_Test/ 폴더에서 PowerShell을 관리자 권한으로 실행:

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

컨테이너 환경에서 게임패드 지원과 60FPS 구동 상태를 사전 검증할 수 있습니다.


9. Microsoft Partner Center 제출 체크리스트

  1. Pricing and availability: 전 세계 240개 시장 선택 및 달러 기준가 설정.
  2. Properties: 카테고리 Games 지정 및 개인정보 처리방침(Privacy Policy) URL 등록.
  3. Age ratings: IARC 설문 완료 (아케이드 게임은 대개 Everyone / PEGI 3 등급 부여).
  4. Store listings: 1920x1080 순수 PC 게임플레이 스크린샷 업로드.
  5. Packages: _bundle.appxupload 업로드 후 Submit to the Store 클릭.

将 MonoGame 桌面游戏发布至 Microsoft Store:完整的 MSIX 与 WAP 指南

将 MonoGame 桌面游戏发布至 Microsoft Store:完整的 MSIX 与 WAP 指南

将独立游戏带到 Windows 10 和 Windows 11 的 Microsoft Store,使开发者能够直接触达数以亿计的 PC 玩家,享受系统级自动更新、Windows Game Bar 集成以及容器化安装的安全优势。然而,如果您的游戏是基于 MonoGame(.NET 8.0 或 .NET 9.0 WindowsDX)构建的,将其引入商店需要一座架构桥梁:将传统的 Win32 可执行文件(.exe)与现代化的 MSIX / AppX 应用模型连接起来。

Arar Games,我们凭借 Paint TrekBlocked: Pixel Panzer 两款作品走通了从代码编译到商店上线的全流程。本指南将全面拆解该工程管线:项目配置、Visual Studio 的 Publish 菜单选项解析、Package.appxmanifest 配置、磁贴图标尺寸缩放、解决 WACK 验证问题以及提交到 Microsoft Partner Center 的实战经验。


1. 架构基石:Win32 与 MSIX 对比

传统 MonoGame 游戏编译为标准的 Win32 应用程序,包含运行时 .dll 和存放已编译二进制资产(.xnb 纹理、.ogg 音频与着色器)的 Content/ 文件夹。

通过 Windows 应用打包 (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

为什么选择 WAP 打包 MonoGame?

  1. 隔离的容器化生命周期: MSIX 应用在沙盒虚拟环境中运行。卸载时会干净彻底地删除所有文件和虚拟注册表项,不留系统垃圾。
  2. 动态架构与资源分发: 单个 .appxupload 包整合了 x86x64 双架构及多种 DPI 缩放资源(scale-100scale-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. Visual Studio Publish 菜单详解

右键点击 WAP 项目选择 Publish 时可见三个功能:

  1. Associate App with the Store...(将应用与商店关联): 登录开发者账号并选择已保留的应用名称,自动拉取正式的 Publisher ID、Package Family Name 并生成 Package.StoreAssociation.xml
  2. Convert Content Group Map File(转换内容组映射文件): 用于支持超大型游戏(50GB 以上)的流式渐进安装(Streaming Install)。独立游戏无需使用,可直接忽略。
  3. Create App Packages...(创建应用程序包): 主打包向导,用于生成本地测试安装包(Sideloading)或商店上架用的 _bundle.appxupload 包。

4. 打包向导配置实战

  • 分发方式: 提交商店选择 "Microsoft Store under a new or existing app name";本地 QA 测试选择 "Sideloading"
  • 架构选择: 勾选 ☑️ x86 与 ☑️ x64(Release 配置)。
  • 捆绑包设置: Generate app bundle: Always
  • 版本号硬性规则: 遵循 Major.Minor.Build.Revision(如 1.0.0.0)。提交到 Partner Center 的新包版本号必须严格高于商店当前生效的版本。勾选 Automatically increment 可以在每次编译时自动递增最后一位修订号。

5. Package.appxmanifest 关键配置

  • <rescap:Capability Name="runFullTrust" />:MonoGame 深度依赖 DirectX 11 和原生 Win32 调用,此受限功能赋予其完全桌面执行权限,同时兼具容器安装优势。
  • InitialRotationPreference="landscape":将屏幕锁定为横屏,适配 ASUS ROG Ally、联想 Legion Go 等 Windows 掌机。

Warning

锁屏角标 (BadgeLogo) 必须纯白: 锁屏图标必须仅由纯白像素 (#FFFFFF) 和透明通道组成。包含任何彩色像素都会导致 WACK 对比度合规检测失败。


7. WACK 验证与问题排查

  • "AppCert.exe wasn't found" 报错: 在 Visual Studio Installer 的独立组件中搜索并安装 "Windows App Certification Kit"。本地运行 WACK 是可选的,上传至商店后台后微软云端会自动执行验证。
  • MonoGame 资源误报 Blocked Executable: .xnb.ogg 二进制可能随机匹配可执行特征。微软商店审核系统能识别其为合法静态游戏数据,不影响审核通过。

8. 本地侧载测试 (Sideloading)

AppPackages/YourGame_Test/ 目录下,以管理员身份运行 PowerShell:

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

验证手柄控制、音频播放和 60 帧流畅度。


9. Microsoft Partner Center 提交流程

  1. Pricing and availability: 选择全球 240 个市场,以美元设置基准价格。
  2. Properties: 选择 Games 分类并提供有效的隐私政策网址(Privacy Policy URL)。
  3. Age ratings: 完成 IARC 问卷评级(街机游戏通常获得 Everyone / PEGI 3)。
  4. Store listings: 上传 1920x1080 纯 PC 实机截图(不可带有移动端触摸摇杆)。
  5. Packages: 拖拽上传 _bundle.appxupload 文件,核对通过后点击 Submit to the Store

结语

通过 WAP 项目封装、配置 runFullTrust 与 x86/x64 混合打包,MonoGame 开发者无需重写 UWP 即可将原生 .NET 9 桌面游戏推向全球 Windows 玩家!