Entwickeln mit Bestandspaketen und Paketfaltung

Wichtig

Wenn Sie Ihre App an die Store übermitteln möchten, müssen Sie sich an Windows Entwicklersupport wenden und die Genehmigung für die Verwendung von Ressourcenpaketen und Paketfaltung erhalten.

Ressourcenpakete können die Gesamtpaketgröße und die Veröffentlichungszeit für Ihre Apps auf dem Store verringern. Weitere Informationen zu Ressourcenpaketen und zur Beschleunigung Ihrer Entwicklungsiterationen finden Sie unter Einführung in Ressourcenpakete.

Wenn Sie über die Verwendung von Ressourcenpaketen für Ihre App nachdenken oder bereits wissen, dass Sie sie verwenden möchten, fragen Sie sich wahrscheinlich, wie Ressourcenpakete Ihren Entwicklungsprozess ändern werden. Kurz gesagt: Die App-Entwicklung für Sie bleibt unverändert. Dies ist aufgrund der Paketfaltung für Ressourcenpakete möglich.

Dateizugriff nach dem Aufteilen Ihrer App

Um zu verstehen, wie sich Paketfaltung nicht auf Ihren Entwicklungsprozess auswirkt, gehen wir zunächst zurück, um zu verstehen, was geschieht, wenn Sie Ihre App in mehrere Pakete aufteilen (entweder mit Ressourcenpaketen oder Ressourcenpaketen).

Wenn Sie einige Dateien Ihrer App in andere Pakete aufteilen (bei denen es sich nicht um Architekturpakete handelt), können Sie relativ zum Ausführungsort Ihres Codes nicht direkt auf diese Dateien zugreifen. Dies liegt daran, dass alle diese Pakete in verschiedenen Verzeichnissen installiert sind, in denen Ihr Architekturpaket installiert ist. Wenn Sie z. B. ein Spiel erstellen und Ihr Spiel in Französisch und Deutsch lokalisiert ist und Sie sowohl für x86- als auch für x64-Computer erstellt haben, sollten Sie diese App-Paketdateien im App-Paket Ihres Spiels haben:

  • MyGame_1.0_x86.appx
  • MyGame_1.0_x64.appx
  • MyGame_1.0_language-fr.appx
  • MyGame_1.0_language-de.appx

Wenn Ihr Spiel auf dem Computer eines Benutzers installiert ist, verfügt jede App-Paketdatei über einen eigenen Ordner im Verzeichnis WindowsApps . Für einen französischen Benutzer, der 64-Bit-Windows ausführt, sieht Ihr Spiel wie folgt aus:

C:\Program Files\WindowsApps\
|-- MyGame_1.0_x64
|   `-- …
|-- MyGame_1.0_language-fr
|   `-- …
`-- …(other apps)

Beachten Sie, dass die App-Paketdateien, die nicht für den Benutzer gelten, nicht installiert werden (die x86- und deutschen Pakete).

Für diesen Benutzer befindet sich die ausführbare Hauptdatei Ihres Spiels im Ordner MyGame_1.0_x64 und wird von dort aus ausgeführt. Normalerweise hat es nur Zugriff auf die Dateien in diesem Ordner. Um auf die Dateien im Ordner MyGame_1.0_language-fr zuzugreifen, müssen Sie entweder die MRT-APIs oder die PackageManager-APIs verwenden. Die MRT-APIs können automatisch die am besten geeignete Datei aus den installierten Sprachen auswählen. Weitere Informationen zu MRT-APIs finden Sie unter Windows. ApplicationModel.Resources.Core. Alternativ können Sie den installierten Speicherort des Pakets in französischer Sprache mithilfe der PackageManager-Klasse ermitteln. Sie sollten nie davon ausgehen, dass die Pakete Ihrer App installiert sind, da sich dies ändern kann und je nach Benutzer variieren kann.

Faltung von Medienobjektpaketen

Wie können Sie also auf die Dateien in Ihren Medienobjektpaketen zugreifen? Nun, Sie können weiterhin die Dateizugriffs-APIs verwenden, die Sie verwenden, um auf jede andere Datei in Ihrem Architekturpaket zuzugreifen. Dies liegt daran, dass Medienobjektpaketdateien in Ihr Architekturpaket integriert werden, wenn es über den Paketfaltungsprozess installiert wird. Da Assetpaketdateien ursprünglich Dateien in Ihren Architekturpaketen sein sollten, bedeutet dies, dass Sie die API-Nutzung nicht ändern müssen, wenn Sie in Ihrem Entwicklungsprozess von der Bereitstellung von losen Dateien zur Paketbereitstellung wechseln.

Um mehr über die Funktionsweise der Paketfaltung zu erfahren, beginnen wir mit einem Beispiel. Wenn Sie über ein Spielprojekt mit der folgenden Dateistruktur verfügen:

MyGame
|-- Audios
|   |-- Level1
|   |   `-- ...
|   `-- Level2
|       `-- ...
|-- Videos
|   |-- Level1
|   |   `-- ...
|   `-- Level2
|       `-- ...
|-- Engine
|   `-- ...
|-- XboxLive
|   `-- ...
`-- Game.exe

Wenn Sie Ihr Spiel in drei Pakete aufteilen möchten: ein x64-Architekturpaket, ein Medienobjektpaket für Audiodateien und ein Medienobjektpaket für Videos, wird Ihr Spiel in diese Pakete unterteilt:

MyGame_1.0_x64.appx
|-- Engine
|   `-- ...
|-- XboxLive
|   `-- ...
`-- Game.exe
MyGame_1.0_Audios.appx
`-- Audios
    |-- Level1
    |   `-- ...
    `-- Level2
        `-- ...
MyGame_1.0_Videos.appx
`-- Videos
    |-- Level1
    |   `-- ...
    `-- Level2
        `-- ...

Wenn Sie Ihr Spiel installieren, wird zuerst das x64-Paket bereitgestellt. Anschließend werden die beiden Ressourcenpakete weiterhin in ihren eigenen Ordnern bereitgestellt, genau wie MyGame_1.0_language-fr aus unserem vorherigen Beispiel. Aufgrund der Paketfaltung sind die Medienobjektpaketdateien jedoch auch schwer verknüpft, sodass sie im Ordner MyGame_1.0_x64 angezeigt werden (obwohl die Dateien an zwei Speicherorten angezeigt werden, nehmen sie nicht das Doppelte des Speicherplatzes in Anspruch). Der Speicherort, an dem die Medienobjektpaketdateien angezeigt werden, ist genau der Speicherort, an dem sie sich relativ zum Stamm des Pakets befinden. So sieht das endgültige Layout des bereitgestellten Spiels aus:

C:\Program Files\WindowsApps\
|-- MyGame_1.0_x64
|   |-- Audios
|   |   |-- Level1
|   |   |   `-- ...
|   |   `-- Level2
|   |       `-- ...
|   |-- Videos
|   |   |-- Level1
|   |   |   `-- ...
|   |   `-- Level2
|   |       `-- ...
|   |-- Engine
|   |   `-- ...
|   |-- XboxLive
|   |   `-- ...
|   `-- Game.exe
|-- MyGame_1.0_Audios
|   `-- Audios
|       |-- Level1
|       |   `-- ...
|       `-- Level2
|           `-- ...
|-- MyGame_1.0_Videos
|   `-- Videos
|       |-- Level1
|       |   `-- ...
|       `-- Level2
|           `-- ...
`-- …(other apps)

Wenn Sie package folding für Medienobjektpakete verwenden, können Sie weiterhin auf die Dateien zugreifen, die Sie in Medienobjektpakete aufgeteilt haben (beachten Sie, dass der Architekturordner die gleiche Struktur wie der ursprüngliche Projektordner aufweist), und Sie können Medienobjektpakete hinzufügen oder Dateien zwischen Medienobjektpaketen verschieben, ohne ihren Code zu beeinträchtigen.

Jetzt ein komplizierteres Paketfaltungsbeispiel. Angenommen, Sie möchten Ihre Dateien basierend auf der Ebene aufteilen, und wenn Sie die gleiche Struktur wie der ursprüngliche Projektordner beibehalten möchten, sollten Ihre Pakete wie folgt aussehen:

MyGame_1.0_x64.appx
|-- Engine
|   `-- ...
|-- XboxLive
|   `-- ...
`-- Game.exe
MyGame_Level1.appx
|-- Audios
|   `-- Level1
|       `-- ...
`-- Videos
    `-- Level1
        `-- ...

MyGame_Level2.appx
|-- Audios
|   `-- Level2
|       `-- ...
`-- Videos
    `-- Level2
        `-- ...

Dadurch können die Ordner und Dateien der Ebene 1 im MyGame_Level1-Paket sowie level2-Ordner und -Dateien im MyGame_Level2-Paket während des Paketfaltens mit den Ordnern Audios und Videos zusammengeführt werden. Als allgemeine Regel ist der relative Pfad, der für gepackte Dateien in der Zuordnungsdatei oder im Paketlayout für MakeAppx.exe festgelegt ist, der Pfad, den Sie verwenden sollten, um nach dem Packen von Paketen darauf zuzugreifen.

Wenn zwei Dateien in unterschiedlichen Ressourcenpaketen mit denselben relativen Pfaden vorhanden sind, führt dies zu einem Konflikt während der Paketfaltung. Wenn ein Konflikt auftritt, führt die Bereitstellung Ihrer App zu einem Fehler und schlägt fehl. Da die Paketfaltung harte Links nutzt, kann Ihre App nicht auf Nicht-NTFS-Laufwerken bereitgestellt werden, wenn Sie Medienobjektpakete verwenden. Wenn Sie wissen, dass Ihre App wahrscheinlich von Ihren Benutzern auf Wechseldatenträger verschoben wird, sollten Sie keine Ressourcenpakete verwenden.