29 Ekim 2026 Perşembe

פרסום משחקי שולחן עבודה של MonoGame ב-Microsoft Store: המדריך המלא ל-MSIX ו-WAP




פרסום משחקי שולחן עבודה של MonoGame ב-Microsoft Store: המדריך המלא ל-MSIX ו-WAP

הבאת משחק אינדי אל ה-Microsoft Store ב-Windows 10 ו-Windows 11 מעניקה למפתחים גישה ישירה למאות מיליוני שחקני מחשב (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, שליטה בקובץ Package.appxmanifest, התאמת נכסים גרפיים לכל רזולוציה, פתרון שגיאות ב-Windows App Certification Kit (WACK) והגשת החבילה ל-Microsoft Partner Center.


1. הבסיס הארכיטקטוני: Win32 לעומת MSIX

משחקי MonoGame מסורתיים מהודרים לקובץ הפעלה Win32 רגיל המלווה בספריות .dll של סביבת הריצה ובתיקיית Content/ המכילה נכסים בינאריים מהודרים (טקסטורות .xnb, קבצי שמע .ogg, ספרי ספריטים ושיידרים מהודרים של HLSL).

בעוד ש-Microsoft Store תומכת בהפצת קבצי Win32 חופשיים ללא אריזה, עטיפת המשחק שלכם בתוך פרויקט Windows Application Packaging (WAP) להפקת חבילת MSIX bundle מספקת יתרונות טכניים ותפעוליים משמעותיים:

flowchart TD
    subgraph "קוד המשחק"
        Shared["ספרייה משותפת Shared\n(ישויות, מערכות, מצבי משחק, מתמטיקה)"]
        Desktop["פרויקט דסקטופ (.NET 9.0 WindowsDX)\n(נקודת כניסה Win32 Executable)"]
        Shared --> Desktop
    end

    subgraph "שכבת האריזה (פרויקט WAP)"
        WAP["פרויקט אריזה ל-Windows (.wapproj)\n(Microsoft Desktop Bridge)"]
        Manifest["Package.appxmanifest\n(זהות, הרשאות, אייקונים)"]
        StoreAssoc["Package.StoreAssociation.xml\n(שיוך לחשבון המפתח ב-Partner Center)"]
        Desktop --> WAP
        Manifest --> WAP
        StoreAssoc --> WAP
    end

    subgraph "פלט והפצה"
        WAP -->|יצירת חבילות| Sideload["חבילת התקנה מקומית\n(*.appxbundle + סקריפט התקנה)"]
        WAP -->|מצב העלאה לחנות| UploadBundle["חבילת העלאה רשמית לחנות\n(*_bundle.appxupload / *.msixupload)"]
        UploadBundle --> MSStore["Microsoft Partner Center\n(חנות מיקרוסופט החיה)"]
    end

מדוע לעטוף את MonoGame בפרויקט WAP?

  1. מחזור חיים מבודד: אפליקציות MSIX רצות בסביבה מבודדת. קבצים ורישומי Registry וירטואליים מוסרים בצורה נקייה לחלוטין בעת הסרת ההתקנה, ללא השארת שאריות במערכת.
  2. הזרמת ארכיטקטורה ונכסים חכמה: חבילת .appxupload בודדת אורזת יחד בינארים עבור x86 ו-x64 יחד עם חבילות קנה מידה מרובות של DPI (מ-scale-100 ועד scale-400). החנות מספקת רק את הארכיטקטורה והקבצים הרלוונטיים למכשיר של השחקן, ומקטינה משמעותית את גודל ההורדה.
  3. טלמטריית קריסות אוטומטית: סמלי הניפוי (PDB) נארזים בקובץ ההעלאה (.appxsym). אם המשחק נתקל בשגיאה לא מטופלת אצל שחקן, לוח המחוונים ב-Partner Center מציג את ה-Stack Trace המדויק עם שמות הפונקציות ומספרי השורות.

2. מבנה הפרויקט והגדרות

פתרון MonoGame נקי דורש הפרדה ברורה בין לוגיקת המשחק לבין אריזת הפלטפורמה:

SolutionDir/
│
├── YourGame.Shared/               # לוגיקת משחק עיקרית, מערכות, שלבים, ישויות
│   └── YourGame.Shared.csproj
│
├── YourGame.Desktop/              # נקודת כניסה ראשית לדסקטופ (WinExe)
│   ├── Content/                   # נכסי MonoGame Content Pipeline (.mgcb -> .xnb)
│   ├── Program.cs
│   └── YourGame.Desktop.csproj
│
└── YourGame.Package/              # פרויקט אריזה (.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>

3. הגדרת המניפסט (Package.appxmanifest)

בתוך פרויקט ה-WAP, קובץ Package.appxmanifest קובע את זהות האפליקציה, ההרשאות ונכסי התצוגה:

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

  <Applications>
    <Application Id="App"
      Executable="YourGame.Desktop.exe"
      EntryPoint="Windows.FullTrustApplication">
      <uap:VisualElements
        DisplayName="Your Game Title"
        Description="Game Description"
        BackgroundColor="transparent"
        Square150x150Logo="Images\Square150x150Logo.png"
        Square44x44Logo="Images\Square44x44Logo.png">
        <uap:DefaultTile ShortName="Your Game" />
        <uap:SplashScreen Image="Images\SplashScreen.png" />
      </uap:VisualElements>
    </Application>
  </Applications>

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

הערה חשובה: משחקי Win32/MonoGame דורשים את הרשאת runFullTrust מכיוון שהם רצים כיישומי שולחן עבודה מלאים מחוץ ל-sandbox המצומצם של UWP הישנה.


4. שיוך לחנות (Store Association) ויצירת חבילות

  1. ב-Visual Studio, לחצו לחצן ימני על פרויקט ה-Package ובחרו:
    Publish -> Associate App with the Store...
  2. התחברו לחשבון ה-Microsoft Developer שלכם ובחרו את שם המשחק שהזמנתם מראש ב-Partner Center. שלב זה ייצור אוטומטית את הקובץ Package.StoreAssociation.xml.
  3. לאחר השיוך, לחצו:
    Publish -> Create App Packages...
  4. סמנו Microsoft Store using a new app name (או החשבון המקושר).
  5. סמנו את הארכיטקטורות x86 ו-x64 במצב Release, וסמנו Always עבור יצירת Bundle.
  6. לאחר סיום הבנייה, Visual Studio תפתח את תיקיית AppPackages ובה קובץ ה-.msixupload המוכן להעלאה.

5. בדיקת תאימות באמצעות WACK (Windows App Certification Kit)

לפני ההעלאה, הריצו את ה-WACK המובנה בכלי היצירה:

  • הכלי בודק חתימות דיגיטליות, הרשאות מוגבלות וחוסר קריסות באתחול.
  • משחקי MonoGame עוברים את כל בדיקות ה-WACK בהצלחה כאשר הם מהודרים במצב Release ונארזים כהלכה.

אודות Arar Games והמשחקים שלנו

גלו את משחקי האינדי שלנו והתחברו לסטודיו:

🎮 המשחקים שלנו

📱 עקבו אחרי הסטודיו ברשתות החברתיות




Hiç yorum yok:

Yorum Gönder