20 Eylül 2026 Pazar

انتشار بازی‌های دسکتاپ MonoGame در Microsoft Store: راهنمای جامع MSIX و WAP

انتشار بازی‌های دسکتاپ MonoGame در Microsoft Store: راهنمای جامع MSIX و WAP

آوردن یک بازی مستقل به Microsoft Store در ویندوز ۱۰ و ویندوز ۱۱ به توسعه‌دهندگان دسترسی مستقیم به صدها میلیون بازیکن رایانه شخصی، به‌روزرسانی‌های خودکار، ادغام با Windows Game Bar و امنیت محیط ایزوله را می‌دهد. با این حال، اگر بازی شما با MonoGame (.NET 8.0 یا .NET 9.0 WindowsDX) ساخته شده است، ورود آن به استور نیازمند یک پل معماری است: متصل کردن یک فایل اجرایی سنتی Win32 (.exe) به مدل مدرن برنامه MSIX / AppX.

ما در Arar Games این مسیر را با عناوینی مانند Paint Trek و Blocked: Pixel Panzer از مراحل اولیه تا انتشار زنده با موفقیت طی کرده‌ایم. در این راهنمای جامع و کاربردی، تمام مراحل فنی را تشریح می‌کنیم: پیکربندی پروژه‌ها، تسلط بر گزینه‌های منوی Publish در ویژوال استودیو، تنظیم فایل Package.appxmanifest، مقیاس‌بندی آیکون‌ها و کاشی‌ها (tiles)، رفع خطاهای Windows App Certification Kit (WACK) و ثبت نهایی در Microsoft Partner Center.


۱. مبانی معماری: مقایسه Win32 و MSIX

بازی‌های سنتی MonoGame به صورت یک فایل اجرایی معمولی Win32 به همراه کتابخانه‌های زمان اجرا (.dll) و یک پوشه Content/ شامل دارایی‌های باینری فشرده‌شده (بافت‌های .xnb، فایل‌های صوتی .ogg و شیدرهای HLSL) کامپایل می‌شوند.

اگرچه مایکروسافت استور اکنون از فایل‌های اجرایی مستقل Win32 نیز پشتیبانی می‌کند، اما قرار دادن بازی در یک پروژه بسته‌بندی برنامه‌های ویندوز (WAP) برای ایجاد یک بسته MSIX bundle مزایای فنی و عملیاتی چشمگیری به همراه دارد:

flowchart TD
    subgraph "پایگاه کد بازی"
        Shared["کتابخانه مشترک
(مکانیک، سیستم‌ها، وضعیت بازی، ریاضی)"]
        Desktop["پروژه دسکتاپ (.NET 9.0 WindowsDX)
(نقطه ورود Win32 Executable)"]
        Shared --> Desktop
    end

    subgraph "لایه بسته‌بندی (پروژه WAP)"
        WAP["بسته‌بندی برنامه ویندوز (.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. تله‌متری خودکار و گزارش خرابی‌ها: ویژوال استودیو فایل‌های نماد خطایابی (.appxsym) را در بسته آپلود قرار می‌دهد. در صورت خرابی بازی در سیستم بازیکن، پشته کامل خطا (stack trace) با نام متدها و شماره خطوط در پنل پارتنر سنتر قابل مشاهده خواهد بود.

۲. سلسله‌مراتب و پیکربندی پروژه

یک پروژه استاندارد MonoGame باید تفکیک کاملی بین منطق بازی و بسته‌بندی پلتفرم داشته باشد:

SolutionDir/
│
├── YourGame.Shared/               # مکانیک اصلی بازی، سطوح و سیستم‌ها (کتابخانه مشترک)
│   └── YourGame.Shared.csproj
│
├── YourGame.Desktop/              # نقطه ورود اجرایی دسکتاپ (WinExe)
│   ├── Content/                   # دارایی‌های پایپ‌لاین MonoGame (.mgcb -> .xnb)
│   ├── Program.cs
│   └── YourGame.Desktop.csproj
│
└── YourGame.Package/              # پروژه بسته‌بندی WAP (.wapproj)
    ├── Images/                    # آیکون‌ها، کاشی‌ها و صفحه لودینگ
    ├── Package.appxmanifest       # هویت، دسترسی‌ها و اطلاعات ظاهری
    ├── Package.StoreAssociation.xml
    └── YourGame.Package.wapproj

گام اول: پیکربندی پروژه اصلی بازی (.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>

گام دوم: بازیابی بسته‌های NuGet برای هر دو معماری

قبل از بسته‌بندی، بسته‌ها را به طور مجزا برای زمان اجرای ۶۴ بیتی و ۳۲ بیتی بازیابی کنید:

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

۳. بررسی گزینه‌های منوی Publish در ویژوال استودیو

وقتی روی پروژه WAP در ویژوال استودیو راست‌کلیک کرده و منوی Publish را باز می‌کنید، سه گزینه مشاهده می‌کنید:

graph TD
    Menu["راست‌کلیک روی پروژه WAP > Publish"]
    Menu --> Opt1["1. Associate App with the Store..."]
    Menu --> Opt2["2. Convert Content Group Map File"]
    Menu --> Opt3["3. Create App Packages... (جریان اصلی کار)"]
    
    Opt1 --> Sync["همگام‌سازی هویت ابری با مانیفست محلی
(تولید Package.StoreAssociation.xml)"]
    Opt2 --> Streaming["تبدیل فایل نقشه نصب جریانی
(برای بازی‌های حجیم با دانلود چندمرحله‌ای)"]
    Opt3 --> Wizards["ویزارد بسته‌بندی:
- سایدلودینگ (تست محلی QA)
- بسته آپلود استور (_bundle.appxupload)"]

۱. Associate App with the Store... (اتصال برنامه به استور)

  • هدف: متصل کردن پروژه محلی با حساب توسعه‌دهنده مایکروسافت پارتنر سنتر.
  • کارکرد: با حساب توسعه‌دهنده خود وارد می‌شوید و نام بازی رزرو شده را انتخاب می‌کنید. ویژوال استودیو شناسه رسمی ناشر (Publisher ID)، نام بسته (Package Name) و شناسه خانوادگی بسته (PFN) را دریافت کرده و فایل Package.StoreAssociation.xml را می‌سازد.
  • اهمیت: در صورت عدم انجام این کار، بسته با گواهی محلی موقت امضا می‌شود و مایکروسافت استور در هنگام آپلود آن را رد می‌کند.

۲. Convert Content Group Map File (تبدیل فایل نقشه گروه‌های محتوا)

  • هدف: پشتیبانی از معماری نصب جریانی (Streaming Install) مایکروسافت.
  • کارکرد: در بازی‌های فوق‌العاده حجیم (بیش از ۵۰ گیگابایت)، به بازیکن امکان می‌دهد در حین دانلود پس‌زمینه مراحل بعدی، مرحله اول را بازی کند. این گزینه فایل SourceAppxContentGroupMap.xml را به AppxContentGroupMap.xml نهایی تبدیل می‌کند.
  • برای بازی‌های مستقل: برای عناوین مستقل کم‌حجم نیازی به این ویژگی نیست و می‌توانید آن را نادیده بگیرید.

۳. Create App Packages... (ایجاد بسته‌های برنامه - ویزارد اصلی)

ابزار اصلی برای ساخت، امضا و تولید بسته نهایی چه برای تست داخلی و چه برای ارسال به استور.


۴. پیکربندی ویزارد ایجاد بسته

در پنجره Create App Packages:

مرحله اول: انتخاب روش توزیع

  • برای ارسال به استور: گزینه "Microsoft Store under a new or existing app name" را انتخاب کنید.
  • برای تست داخلی (Sideloading): گزینه "Sideloading" را انتخاب کنید تا بسته‌ای همراه با گواهی آزمایشی محلی (.cer) و اسکریپت نصب پاورشل (Add-AppDevPackage.ps1) ایجاد شود.

مرحله دوم: تنظیمات معماری و نسخه

┌─────────────────────────────────────────────────────────────┐
│ Output location: .\AppPackages\                             │
│ Version: 1.0.0.0      [☑ Automatically increment]           │
│                                                             │
│ Generate app bundle: Always                                 │
│                                                             │
│ Architectures:                                              │
│   ☑ 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. انتشار اولیه با 1.0.0.0 آغاز می‌شود.
  • قانون غیرقابل تغییر استور: نسخه هر بسته جدید آپلود شده در پارتنر سنتر باید حتماً بالاتر از نسخه فعال فعلی باشد.
  • فعال بودن گزینه Automatically increment در هر بار خروجی گرفتن، شماره Revision را یکی افزایش می‌دهد تا از تداخل نسخه‌ها جلوگیری شود.

چرا x64 + x86 و Generate app bundle: Always؟

  • x64: سیستم‌های مدرن ۶۴ بیتی (بیش از ۹۸٪ گیمرهای پی‌سی) را هدف قرار می‌دهد.
  • x86: سازگاری برای سیستم‌های ۳۲ بیتی قدیمی را تضمین می‌کند.
  • حالت Always هر دو معماری را در یک فایل فشرده منفرد (_bundle.appxupload) بسته‌بندی می‌کند.

۵. تنظیم فایل 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>

نکات کلیدی:

  1. مجوز <rescap:Capability Name="runFullTrust" />: از آنجا که MonoGame از DirectX 11 و دسترسی‌های مستقیم سیستمی استفاده می‌کند، نمی‌تواند در محیط سندروم محدود UWP اجرا شود. این قابلیت به بازی دسترسی کامل دسکتاپ می‌دهد در حالی که پاکیزگی نصب کانتینری حفظ می‌شود.
  2. جهت چرخش InitialRotationPreference روی landscape: کنسول‌های دستی ویندوزی (مانند ASUS ROG Ally و Lenovo Legion Go) نمایشگرهای عمودی با چرخش سخت‌افزاری دارند. قفل کردن روی جهت افقی مانع چرخش ناخواسته تصویر می‌شود.

ویندوز تصاویر را با ضرایب مقیاس مختلف (scale-100, 125, 150, 200, 400) نمایش می‌دهد:

نوع تصویر اندازه پایه (scale-100) scale-200 scale-400 کاربرد
Square44x44Logo ۴۴ × ۴۴ پیکسل ۸۸ × ۸۸ ۱۷۶ × ۱۷۶ آیکون نوار وظیفه و لیست برنامه‌ها
Square150x150Logo ۱۵۰ × ۱۵۰ ۳۰۰ × ۳۰۰ ۶۰۰ × ۶۰۰ کاشی متوسط منوی استارت
Wide310x150Logo ۳۱۰ × ۱۵۰ ۶۲۰ × ۳۰۰ ۱۲۴۰ × ۶۰۰ کاشی عریض منوی استارت
LargeTile ۳۱۰ × ۳۱۰ ۶۲۰ × ۶۲۰ ۱۲۴۰ × ۱۲۴۰ کاشی بزرگ منوی استارت
SmallTile ۷۱ × ۷۱ ۱۴۲ × ۱۴۲ ۲۸۴ × ۲۸۴ کاشی کوچک منوی استارت
SplashScreen ۶۲۰ × ۳۰۰ ۱۲۴۰ × ۶۰۰ ۲۴۸۰ × ۱۲۰۰ بنر صفحه لودینگ
StoreLogo ۵۰ × ۵۰ ۱۰۰ × ۱۰۰ ۲۰۰ × ۲۰۰ آیکون بازی در فروشگاه استور
BadgeLogo ۲۴ × ۲۴ ۴۸ × ۴۸ ۹۶ × ۹۶ نشان اعلان صفحه قفل ویندوز

Warning

قانون حیاتی BadgeLogo: نشان صفحه قفل (BadgeLogo) باید کاملاً تک‌رنگ و فقط از پیکسل‌های سفید خالص (#FFFFFF) با پس‌زمینه شفاف تشکیل شده باشد. استفاده از رنگ‌های دیگر باعث خطای تست تضاد رنگ در WACK و رد شدن تاییدیه می‌شود.


۷. تست WACK و خطایابی

خطای "The tool AppCert.exe wasn't found"

در صورت کلیک روی دکمه WACK و مواجهه با این خطا:

  • این مشکل به علت نصب نشدن ابزار در ویژوال استودیو است. از طریق Visual Studio Installer $ ightarrow$ تب Individual components گزینه "Windows App Certification Kit" را نصب کنید.
  • اجرای تست WACK در سیستم محلی اختیاری است؛ سیستم ابری مایکروسافت پس از آپلود به صورت خودکار تمامی این تست‌ها را انجام می‌دهد.

هشدار مثبت کاذب فایل‌های فشرده MonoGame

در صورت گزارش بافت‌ها (.xnb) یا صداها (.ogg) به عنوان فایل‌های مسدود شده در WACK، نگران نباشید؛ ساختار بایت‌های فشرده گاهی مشابه هدر فایل‌های اجرایی به نظر می‌رسد و تیم ارزیابی مایکروسافت این موضوع را در بازی‌ها به عنوان فایل محتوای ایستا تایید می‌کند.


۸. تست محلی با سایدلودینگ (Sideloading)

قبل از آپلود نهایی، فایل‌های پوشه AppPackages/YourGame_1.0.0.0_Test/ را بررسی کنید. با راست‌کلیک روی پاورشل و اجرای دستور زیر به عنوان مدیر (Administrator):

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

بازی روی سیستم شما نصب شده و می‌توانید عملکرد دسته بازی، صدا و روان بودن اجرای ۶۰ فریم آن را در محیط ایزوله کانتینر ارزیابی نمایید.


۹. چک‌لیست نهایی مایکروسافت پارتنر سنتر

فایل _bundle.appxupload را در داشبورد پارتنر سنتر بارگذاری نمایید:

  1. Pricing and Availability: انتخاب تمامی بازارهای جهانی (۲۴۰ کشور) و تعیین قیمت پایه بر حسب دلار (تبدیل ارزها خودکار انجام می‌شود).
  2. Properties: تعیین دسته‌بندی Games و قرار دادن آدرس اینترنتی سیاست حفظ حریم خصوصی (Privacy Policy URL).
  3. Age Ratings: تکمیل پرسشنامه IARC (بازی‌های آرکید عموماً رتبه Everyone / PEGI 3 دریافت می‌کنند).
  4. Store Listings: آپلود اسکرین‌شات‌های 1920x1080 دسکتاپ (بدون دکمه‌های لمسی موبایل).
  5. Packages: آپلود بسته نهایی و زدن دکمه Submit to the Store. تاییدیه معمولاً بین ۲۴ تا ۷۲ ساعت صادر می‌شود.

نتیجه‌گیری

انتشار بازی‌های دسکتاپ MonoGame در مایکروسافت استور به هیچ وجه نیازمند بازنویسی کدها برای UWP یا فدا کردن عملکرد نسخه ۹ دات‌نت نیست. با بهره‌گیری از پروژه WAP، تنظیم دسترسی runFullTrust و تجمیع معماری‌های x86 و x64، می‌توانید بازی خود را در اختیار جامعه عظیم پی‌سی گیمرهای سراسر دنیا قرار دهید!

MonoGame-desktopgames publiceren in de Microsoft Store: De complete MSIX- en WAP-gids

MonoGame-desktopgames publiceren in de Microsoft Store: De complete MSIX- en WAP-gids

Een indiegame uitbrengen in de Microsoft Store op Windows 10 en Windows 11 geeft ontwikkelaars direct toegang tot honderden miljoenen pc-gamers, automatische achtergrond-updates, Windows Game Bar-integratie en een veilige installatieomgeving. Als je game echter is gebouwd met MonoGame (.NET 8.0 of .NET 9.0 WindowsDX), vereist distributie via de store een architecturale brug: het verbinden van een standaard Win32-bestand (.exe) met het moderne MSIX / AppX-applicatiemodel.

Bij Arar Games hebben we dit traject succesvol doorlopen met games zoals Paint Trek en Blocked: Pixel Panzer. In deze handleiding behandelen we het complete technische proces: projectconfiguratie, de opties in het Publish-menu van Visual Studio, Package.appxmanifest, schaling van grafische tegels, het oplossen van WACK-fouten en de indiening in Microsoft Partner Center.


1. Architecturale basis: Win32 vs MSIX

Standaard MonoGame-games compileren naar een Win32-applicatie met runtime-bibliotheken (.dll) en een Content/-map met gecomprimeerde bestanden (.xnb, .ogg, shaders).

Het verpakken van de game in een Windows Application Packaging (WAP)-project om een MSIX bundle te creëren biedt grote voordelen:

  1. Geïsoleerde container: MSIX-apps draaien in een beschermde omgeving. Bij verwijdering worden alle bestanden en virtuele registerwaarden zonder restanten opgeruimd.
  2. Dynamische distributie: Eén .appxupload-pakket bundelt x86- en x64-uitvoerbestanden samen met DPI-schaalpakketten (scale-100 tot scale-400). Gebruikers downloaden alleen wat voor hun pc nodig is.
  3. Automatische crash-telemetrie: Visual Studio voegt foutopsporingssymbolen (.appxsym) toe. Bij crashes toont het Partner Center-dashboard de volledige stack trace inclusief regelnummers.

2. Projectconfiguratie

Stel in het .csproj-bestand van je desktopgame ondersteuning in voor meerdere architecturen:

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

Herstel de NuGet-pakketten:

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

3. Visual Studio Publish-menuopties

  1. Associate App with the Store...: Koppelt het project aan de geregistreerde app in Partner Center en maakt Package.StoreAssociation.xml aan.
  2. Convert Content Group Map File: Voor streaminginstallaties bij enorme games (+50 GB). Niet nodig voor indiegames.
  3. Create App Packages...: De wizard voor het maken van testpakketten (Sideloading) of het definitieve winkelpakket (_bundle.appxupload).

4. De pakketwizard configureren

  • Distributiemethode: Kies "Microsoft Store under a new or existing app name" voor publicatie of "Sideloading" voor lokale tests.
  • Architecturen: Vink ☑️ x86 en ☑️ x64 aan (Release-configuratie).
  • Bundle: Zet Generate app bundle: Always.
  • Versienummering: Volgt Major.Minor.Build.Revision (bijv. 1.0.0.0). Elk nieuw pakket in Partner Center moet een hoger versienummer hebben dan het actieve pakket. Met Automatically increment wordt het revisienummer bij elke build automatisch verhoogd.

5. Instellingen in Package.appxmanifest

  • <rescap:Capability Name="runFullTrust" />: Noodzakelijk omdat MonoGame DirectX 11 en systeemaanroepen gebruikt. Dit geeft volledige desktoptoegang binnen de schone MSIX-omgeving.
  • InitialRotationPreference="landscape": Vergrendelt de liggende stand voor handhelds (zoals ASUS ROG Ally).

6. Visuele activa en de BadgeLogo-regel

Warning

Strikte BadgeLogo-regel: Het vergrendelingsschermpictogram (BadgeLogo) mag uitsluitend bestaan uit zuiver witte pixels (#FFFFFF) en transparantie. Kleuren leiden tot afwijzing in de WACK-contrasttest.


7. WACK-validatie en probleemoplossing

  • Fout "AppCert.exe wasn't found": Installeer de Windows App Certification Kit via Visual Studio Installer. Lokale controle is optioneel; Microsoft voert de tests automatisch uit in de cloud.
  • Valse meldingen bij MonoGame-bestanden: Gecomprimeerde .xnb- of .ogg-bestanden kunnen toevallig lijken op uitvoerbare headers, maar worden door Microsoft geaccepteerd als statische game-inhoud.

8. Lokaal testen via Sideloading

Open PowerShell als Administrator in AppPackages/YourGame_Test/ en voer uit:

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

9. Checklist voor Microsoft Partner Center

  1. Prijzen en beschikbaarheid: Selecteer alle 240 markten en stel de basisprijs in USD in.
  2. Eigenschappen: Kies categorie Games en vul een privacybeleid-URL in.
  3. Leeftijdsclassificatie (IARC): Vul de vragenlijst in (arcadegames krijgen meestal Everyone / PEGI 3).
  4. Winkelvermelding: Upload pc-screenshots van 1920x1080 (zonder mobiele touchknoppen).
  5. Pakketten: Sleep het _bundle.appxupload-bestand naar het venster en klik op Submit to the Store.

Publikowanie gier desktopowych MonoGame w Microsoft Store: Kompletny przewodnik po MSIX i WAP

Publikowanie gier desktopowych MonoGame w Microsoft Store: Kompletny przewodnik po MSIX i WAP

Wprowadzenie gry niezależnej do Microsoft Store w systemach Windows 10 i Windows 11 zapewnia twórcom bezpośredni dostęp do setek milionów graczy na PC, automatyczne aktualizacje w tle, integrację z Windows Game Bar oraz bezpieczeństwo instalacji w piaskownicy. Jednak jeśli Twoja gra powstała w MonoGame (.NET 8.0 lub .NET 9.0 WindowsDX), proces wydawniczy wymaga mostu architektonicznego: połączenia tradycyjnego pliku wykonywalnego Win32 (.exe) z nowoczesnym modelem aplikacji MSIX / AppX.

W Arar Games przeszliśmy tę ścieżkę z grami Paint Trek oraz Blocked: Pixel Panzer – od pierwszych kompilacji po obecność w sklepie. W tym poradniku omawiamy cały proces: konfigurację projektów, opcje menu Publish w Visual Studio, konfigurację Package.appxmanifest, skalowanie grafik kafelków, rozwiązywanie błędów WACK i zgłoszenie w Microsoft Partner Center.


1. Fundamenty architektury: Win32 a MSIX

Tradycyjne gry MonoGame kompilują się do pliku Win32 .exe, bibliotek .dll oraz folderu Content/ ze skompresowanymi zasobami (tekstury .xnb, dźwięki .ogg, shadery).

Opakowanie gry w projekt Windows Application Packaging (WAP) w celu utworzenia pakietu MSIX bundle przynosi wymierne korzyści:

  1. Izolowany cykl życia: Aplikacje MSIX działają w odizolowanym kontenerze. Przy odinstalowaniu wszystkie pliki i wirtualne wpisy rejestru są czyszczone bez śladu.
  2. Optymalizacja rozmiaru: Pojedynczy pakiet .appxupload łączy wersje x86 i x64 oraz skale DPI (scale-100 do scale-400). Gracz pobiera tylko pliki pasujące do jego konfiguracji.
  3. Telemetria awarii: Visual Studio dołącza pliki symboli (.appxsym). W razie awarii panel Partner Center wyświetla pełny ślad stosu (stack trace) z numerami linii kodu.

2. Konfiguracja projektu

W pliku .csproj gry włącz obsługę wielu platform oraz kopiowanie zawartości:

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

Przywróć pakiety NuGet:

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

3. Opcje menu Publish w Visual Studio

  1. Associate App with the Store...: Łączy projekt z kontem Partner Center i generuje Package.StoreAssociation.xml.
  2. Convert Content Group Map File: Obsługa instalacji strumieniowej dla gier powyżej 50 GB (niepotrzebne w grach indie).
  3. Create App Packages...: Główny kreator do generowania pakietów testowych (Sideloading) lub gotowej paczki sklepowej (_bundle.appxupload).

4. Konfiguracja kreatora pakietów

  • Dystrybucja: Wybierz "Microsoft Store under a new or existing app name" dla sklepu lub "Sideloading" do testów lokalnych.
  • Architektury: Zaznacz ☑️ x86 oraz ☑️ x64 (konfiguracja Release).
  • Generowanie bundle: Generate app bundle: Always.
  • Zasada numeracji wersji: W formacie Major.Minor.Build.Revision (np. 1.0.0.0). Każdy nowy pakiet musi mieć numer wyższy od aktualnie opublikowanego. Opcja Automatically increment podnosi numer rewizji przy każdej kompilacji.

5. Konfiguracja pliku Package.appxmanifest

  • <rescap:Capability Name="runFullTrust" />: Daje grze pełne uprawnienia pulpitu niezbędne dla DirectX 11 przy zachowaniu bezpieczeństwa instalacji MSIX.
  • InitialRotationPreference="landscape": Blokuje orientację poziomą, co jest kluczowe dla przenośnych konsol z Windows (np. ASUS ROG Ally).

Warning

Zasada BadgeLogo: Ikona ekranu blokady (BadgeLogo) musi składać się wyłącznie z czysto białych pikseli (#FFFFFF) na przezroczystym tle. Jakikolwiek kolor spowoduje błąd kontrastu w teście WACK.


7. Weryfikacja WACK i rozwiązywanie problemów

  • Błąd "AppCert.exe wasn't found": Zainstaluj zestaw Windows App Certification Kit w Visual Studio Installer. Test lokalny jest opcjonalny – chmura Microsoft wykonuje go automatycznie po przesłaniu pliku.
  • Fałszywe alarmy dla plików MonoGame: Pliki .xnb lub .ogg mogą przypominać nagłówki plików binarnych, ale zespół certyfikacyjny Microsoftu traktuje je jako statyczne dane gry.

8. Testy lokalne (Sideloading)

W folderze AppPackages/YourGame_Test/ uruchom PowerShell jako administrator:

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

9. Zgłoszenie w Microsoft Partner Center

  1. Ceny i dostępność: Wybierz 240 rynków i cenę bazową w USD.
  2. Właściwości: Kategoria Games oraz link do Polityki Prywatności.
  3. Klasyfikacja wiekowa: Wypełnij ankietę IARC (gry zręcznościowe otrzymują Everyone / PEGI 3).
  4. Materiały graficzne: Zrzuty ekranu PC 1920x1080 (bez mobilnych przycisków dotykowych).
  5. Pakiety: Prześlij plik _bundle.appxupload i kliknij Submit to the Store.

Publicando jogos desktop MonoGame na Microsoft Store: O guia definitivo de MSIX e WAP

Publicando jogos desktop MonoGame na Microsoft Store: O guia definitivo de MSIX e WAP

Levar um jogo independente para a Microsoft Store no Windows 10 e Windows 11 oferece aos desenvolvedores acesso direto a centenas de milhões de jogadores de PC, atualizações automáticas em segundo plano, integração com a Windows Game Bar e a segurança de uma instalação em contêiner. No entanto, se o seu jogo foi desenvolvido com MonoGame (.NET 8.0 ou .NET 9.0 WindowsDX), colocá-lo na loja requer uma ponte arquitetural: unir um executável Win32 tradicional (.exe) com o modelo moderno de aplicativos MSIX / AppX.

Na Arar Games, percorremos todo esse caminho com jogos como Paint Trek e Blocked: Pixel Panzer, desde a compilação inicial até o lançamento oficial. Neste guia prático, detalhamos todo o pipeline técnico: configuração de projetos, domínio das opções do menu Publish no Visual Studio, configuração do Package.appxmanifest, dimensionamento de tiles visuais, resolução de alertas do WACK e envio ao Microsoft Partner Center.


1. Fundamentos da Arquitetura: Win32 vs MSIX

Jogos MonoGame tradicionais são compilados em um executável Win32 comum, bibliotecas de tempo de execução (.dll) e uma pasta Content/ com recursos binários compactados (texturas .xnb, áudio .ogg, shaders).

O empacotamento do jogo em um projeto Windows Application Packaging (WAP) para gerar um MSIX bundle oferece vantagens definitivas:

  1. Ciclo de vida isolado em contêiner: Aplicativos MSIX rodam em ambiente isolado. Na desinstalação, todos os arquivos e entradas virtuais do registro são removidos sem deixar lixo no sistema operacional.
  2. Distribuição dinâmica e economia de espaço: Um único pacote .appxupload reúne binários x86 e x64 com múltiplos pacotes de escala DPI (scale-100 até scale-400). O usuário baixa apenas o conteúdo compatível com seu hardware.
  3. Telemetria automática de falhas: O Visual Studio inclui os símbolos de depuração (.appxsym). Havendo falhas na máquina do jogador, o painel do Partner Center apresenta o rastreamento de pilha (stack trace) completo com linhas de código.

2. Configuração do Projeto

No arquivo .csproj principal, configure o suporte multiplataforma e a cópia de conteúdo:

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

Restauração de pacotes NuGet:

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

3. As Opções do Menu Publish no Visual Studio

Ao clicar com o botão direito no projeto WAP e selecionar Publish:

  1. Associate App with the Store...: Associa o projeto ao app reservado no Partner Center, obtém o Publisher ID oficial e gera o Package.StoreAssociation.xml.
  2. Convert Content Group Map File: Recurso de streaming de instalação para jogos gigantescos (+50 GB). Dispensável para jogos indie.
  3. Create App Packages...: O assistente principal para criar pacotes de teste local (Sideloading) ou o arquivo para a loja (_bundle.appxupload).

4. Configuração do Assistente de Criação de Pacotes

  • Método de distribuição: Escolha "Microsoft Store under a new or existing app name" para a loja ou "Sideloading" para testes internos.
  • Arquiteturas: Marque ☑️ x86 e ☑️ x64 em Release.
  • Geração de bundle: Generate app bundle: Always.
  • Regra estrita de versionamento: Formato Major.Minor.Build.Revision (ex: 1.0.0.0). Todo novo pacote enviado à loja deve ter uma versão estritamente maior que a versão ativa. Marcar Automatically increment adiciona +1 à revisão a cada build.

5. Configuração do Package.appxmanifest

  • <rescap:Capability Name="runFullTrust" />: Como o MonoGame utiliza DirectX 11 e chamadas nativas de sistema, esse privilégio assegura execução completa mantendo o isolamento seguro do contêiner.
  • InitialRotationPreference="landscape": Trava a tela em modo paisagem, fundamental para consoles portáteis Windows (ASUS ROG Ally, Lenovo Legion Go).

Warning

Regra do BadgeLogo: O ícone da tela de bloqueio (BadgeLogo) precisa ser composto exclusivamente de pixels brancos puros (#FFFFFF) sobre fundo transparente. Cores ou degradês causarão reprovação no teste de contraste do WACK.


7. Validação WACK e Solução de Problemas

  • Erro "AppCert.exe wasn't found": Instale o componente Windows App Certification Kit no Visual Studio Installer. O teste local é opcional; os servidores em nuvem da Microsoft executam a validação completa no envio.
  • Falso positivo de executável bloqueado: Arquivos .xnb ou .ogg podem coincidir com assinaturas binárias PE. O processo de certificação da Microsoft reconhece-os como dados de jogo estáticos e aprova o aplicativo.

8. Teste Local via Sideloading

Na pasta AppPackages/YourGame_Test/, execute o PowerShell como Administrador:

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

9. Checklist de Envio no Microsoft Partner Center

  1. Preço e disponibilidade: Selecione os 240 mercados mundiais e defina o valor em dólar.
  2. Propriedades: Categoria Games e link da Política de Privacidade (Privacy Policy).
  3. Classificação indicativa (IARC): Responda ao questionário (jogos arcade geralmente recebem Everyone / PEGI 3).
  4. Listagem da loja: Envie capturas de tela de PC em 1920x1080 (sem controles de toque móveis).
  5. Pacotes: Envie o arquivo _bundle.appxupload e clique em Submit to the Store.

Publicación de juegos de escritorio MonoGame en Microsoft Store: Guía completa de MSIX y WAP

Publicación de juegos de escritorio MonoGame en Microsoft Store: Guía completa de MSIX y WAP

Llevar un juego indie a la Microsoft Store en Windows 10 y Windows 11 ofrece a los desarrolladores acceso directo a cientos de millones de jugadores de PC, actualizaciones automáticas en segundo plano, integración con la barra de juegos de Windows y la seguridad de una instalación en contenedor. Sin embargo, si tu juego está creado con MonoGame (.NET 8.0 o .NET 9.0 WindowsDX), publicarlo requiere un puente arquitectónico: conectar un ejecutable Win32 estándar (.exe) con el moderno modelo de aplicaciones MSIX / AppX.

En Arar Games, hemos recorrido este camino con títulos como Paint Trek y Blocked: Pixel Panzer, desde la primera compilación hasta la publicación en tienda. En esta guía técnica, desglosamos todo el proceso: configuración de proyectos, opciones del menú Publish en Visual Studio, configuración de Package.appxmanifest, escalado de iconos y tiles, resolución de errores de WACK y envío final a Microsoft Partner Center.


1. Fundamentos arquitectónicos: Win32 frente a MSIX

Los juegos MonoGame tradicionales se compilan en un ejecutable Win32 estándar acompañado de bibliotecas .dll y una carpeta Content/ con recursos binarios comprimidos (texturas .xnb, audio .ogg, shaders HLSL).

Empaquetar el juego mediante un proyecto Windows Application Packaging (WAP) para generar un MSIX bundle aporta ventajas esenciales:

  1. Ciclo de vida aislado en contenedor: Las aplicaciones MSIX se ejecutan de forma aislada. Al desinstalarse, se eliminan por completo todos los archivos y entradas de registro virtualizadas sin dejar residuos en el sistema.
  2. Distribución dinámica y descargas optimizadas: Un único paquete .appxupload combina binarios x86 y x64 junto con paquetes de escala DPI (scale-100 a scale-400). La tienda solo descarga en el equipo del usuario los archivos necesarios.
  3. Telemetría de errores automática: Visual Studio incluye símbolos de depuración (.appxsym). Si el juego falla, el panel de Partner Center muestra la traza de la pila (stack trace) completa con nombres de métodos y números de línea.

2. Estructura y configuración del proyecto

En el archivo .csproj del juego de escritorio, habilita la compatibilidad con múltiples plataformas y la copia de contenido:

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

Restaura los paquetes NuGet para ambas arquitecturas:

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

3. Opciones del menú Publish en Visual Studio

Al hacer clic derecho en el proyecto WAP y abrir Publish, encontrarás tres opciones:

  1. Associate App with the Store...: Conecta el proyecto con tu cuenta de Partner Center, obtiene el Publisher ID oficial y genera Package.StoreAssociation.xml.
  2. Convert Content Group Map File: Conversión para instalaciones en streaming en juegos de gran tamaño (+50 GB). No es necesario para juegos indie.
  3. Create App Packages...: Asistente principal para generar paquetes de prueba local (Sideloading) o el paquete final para la tienda (_bundle.appxupload).

4. Configuración del asistente de empaquetado

  • Método de distribución: Selecciona "Microsoft Store under a new or existing app name" para la tienda o "Sideloading" para pruebas en equipos locales.
  • Arquitecturas: Marca ☑️ x86 y ☑️ x64 (configuración Release).
  • Bundle: Selecciona Generate app bundle: Always.
  • Regla de versión: Formato Major.Minor.Build.Revision (ej. 1.0.0.0). Cualquier nuevo paquete subido a la tienda debe tener una versión superior a la actualmente activa. La opción Automatically increment aumenta automáticamente la revisión.

5. Parámetros clave de Package.appxmanifest

  • <rescap:Capability Name="runFullTrust" />: Al requerir DirectX 11 y llamadas nativas, este permiso otorga acceso completo de escritorio manteniendo la limpieza del contenedor MSIX.
  • InitialRotationPreference="landscape": Fija la orientación horizontal, indispensable para dispositivos portátiles con Windows (ASUS ROG Ally, Lenovo Legion Go).

Warning

Requisito para BadgeLogo: El icono de la pantalla de bloqueo (BadgeLogo) debe estar formado exclusivamente por píxeles blancos puros (#FFFFFF) sobre fondo transparente. Incluir colores provocará un fallo de contraste en el test de certificación WACK.


7. Pruebas WACK y resolución de problemas

  • Error "AppCert.exe wasn't found": Instala el componente Windows App Certification Kit desde Visual Studio Installer. La prueba local es opcional, ya que Microsoft ejecuta estos análisis automáticamente al subir el paquete a la nube.
  • Falsos positivos en archivos de MonoGame: Archivos binarios .xnb o .ogg pueden coincidir aleatoriamente con firmas de encabezados PE. Microsoft los reconoce como recursos estáticos del juego y aprueba la publicación.

8. Pruebas locales con Sideloading

En la carpeta AppPackages/YourGame_Test/, abre PowerShell como administrador y ejecuta:

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

9. Lista de control de Microsoft Partner Center

  1. Pricing and availability: Selecciona todos los mercados (240 países) y define el precio base en USD.
  2. Properties: Clasifica el juego en Games e incluye el enlace a tu Política de Privacidad.
  3. Age ratings: Completa el formulario de IARC (los juegos arcade suelen recibir Everyone / PEGI 3).
  4. Store listings: Sube capturas de pantalla de PC en 1920x1080 (sin botones táctiles móviles).
  5. Packages: Sube el archivo _bundle.appxupload y haz clic en Submit to the Store.

Microsoft Store पर MonoGame डेस्कटॉप गेम प्रकाशित करना: संपूर्ण MSIX और WAP गाइड

Microsoft Store पर MonoGame डेस्कटॉप गेम प्रकाशित करना: संपूर्ण MSIX और WAP गाइड

Windows 10 और Windows 11 पर Microsoft Store में एक इंडी गेम लॉन्च करने से डेवलपर्स को करोड़ों पीसी गेमर्स तक सीधी पहुंच, पृष्ठभूमि में स्वचालित अपडेट, 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 सेटिंग्स, टाइल आकृतियों के स्केलिंग, WACK प्रमाणीकरण और Microsoft Partner Center सबमिशन के सभी चरणों की व्याख्या करते हैं।


1. आर्किटेक्चरल आधार: Win32 बनाम MSIX

पारंपरिक MonoGame गेम Win32 .exe, रनटाइम लाइब्रेरीज़ (.dll) और संपीड़ित सामग्री वाली Content/ निर्देशिका (.xnb बनावट, .ogg ऑडियो और शेडर्स) में संकलित होते हैं।

गेम को Windows Application Packaging (WAP) प्रोजेक्ट में लपेटकर MSIX bundle बनाने के प्रमुख लाभ:

  1. पृथक कंटेनर जीवनचक्र: MSIX ऐप एक सुरक्षित पृथक वातावरण में चलते हैं। अनइंस्टॉल करने पर सभी फ़ाइलें और रजिस्ट्री प्रविष्टियाँ बिना किसी कचरे के साफ हो जाती हैं।
  2. गतिशील आर्किटेक्चर वितरण: एकल .appxupload पैकेज में x86 और x64 बाइनरी तथा विभिन्न DPI स्केल (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. Visual Studio के Publish मेनू विकल्प

  1. Associate App with the Store...: प्रोजेक्ट को Partner Center में आरक्षित ऐप से जोड़ता है और 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" चुनें।
  • आर्किटेक्चर: Release मोड में ☑️ x86 और ☑️ x64 दोनों का चयन करें।
  • बंडल निर्माण: Generate app bundle: Always सेट करें।
  • संस्करण नियम: Major.Minor.Build.Revision (जैसे 1.0.0.0)। स्टोर पर अपलोड किए जाने वाले प्रत्येक नए पैकेज का संस्करण नंबर सक्रिय संस्करण से अधिक होना अनिवार्य हैAutomatically increment चालू रखने पर प्रत्येक बिल्ड में रिवीजन नंबर अपने आप बढ़ जाता है।

5. Package.appxmanifest मुख्य सेटिंग्स

  • <rescap:Capability Name="runFullTrust" />: MonoGame को DirectX 11 और मूल Win32 कॉल के लिए पूर्ण डेस्कटॉप अनुमतियों की आवश्यकता होती है, जो यह कंटेनर की सुरक्षा के साथ प्रदान करता है।
  • InitialRotationPreference="landscape": पोर्टेबल Windows गेमिंग डिवाइस (जैसे ASUS ROG Ally) के लिए लैंडस्केप ओरिएंटेशन लॉक करता है।

Warning

BadgeLogo का सख्त नियम: लॉक स्क्रीन आइकन (BadgeLogo) केवल शुद्ध सफेद (#FFFFFF) पिक्सल और पारदर्शी पृष्ठभूमि से बना होना चाहिए। रंगीन पिक्सल WACK कंट्रास्ट टेस्ट में विफलता का कारण बनते हैं।


7. WACK सत्यापन और समस्या निवारण

  • "AppCert.exe wasn't found" त्रुटि: Visual Studio Installer के व्यक्तिगत घटक टैब से Windows App Certification Kit स्थापित करें। स्थानीय परीक्षण वैकल्पिक है; स्टोर अपलोड पर माइक्रोसॉफ्ट क्लाउड स्वचालित रूप से यह परीक्षण करता है।
  • MonoGame फ़ाइलों की गलत पहचान: .xnb या .ogg बाइनरी कभी-कभी निष्पादन योग्य हेडर से मेल खा सकती हैं, लेकिन माइक्रोसॉफ्ट इन्हें स्थिर गेम सामग्री के रूप में मान्यता देकर मंजूरी देता है।

8. साइडलोडिंग द्वारा स्थानीय परीक्षण

AppPackages/YourGame_Test/ फ़ोल्डर में व्यवस्थापक के रूप में PowerShell खोलें और चलाएं:

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

9. Microsoft Partner Center सबमिशन चेकलिस्ट

  1. मूल्य निर्धारण और उपलब्धता: सभी 240 बाज़ार चुनें और USD में आधार मूल्य निर्धारित करें।
  2. विशेषताएं: श्रेणी Games चुनें और गोपनीयता नीति URL (Privacy Policy) प्रदान करें।
  3. आयु रेटिंग: IARC प्रश्नावली पूरी करें (आर्केड गेम को आमतौर पर Everyone / PEGI 3 मिलता है)।
  4. स्टोर लिस्टिंग: 1920x1080 पीसी गेमप्ले स्क्रीनशॉट अपलोड करें।
  5. पैकेज: _bundle.appxupload अपलोड करें और Submit to the Store पर क्लिक करें।

نشر ألعاب سطح المكتب 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.