-
Notifications
You must be signed in to change notification settings - Fork 1
FAQ
WPR (Windows Phone Runner) is a runtime compatibility layer that re-hosts
Windows Phone 7/8 XNA games — and a growing subset of Silverlight titles —
on modern Windows desktop and (eventually) Android. It takes an
unmodified .xap package, IL-rewrites the game's assemblies at install
time to redirect WP / Silverlight / XNA API calls to in-tree shims, then
runs the game on FNA (XNA reimplementation) or an Avalonia-based
Silverlight runtime.
This wiki covers the .NET 8 + Avalonia 11.3.9 fork at https://github.com/Bubbleshum/WPR.
No. WPR doesn't emulate ARM, the OS kernel, or the Windows Phone hardware. It runs the game's original .NET assemblies on modern .NET, with the WP/XNA APIs reimplemented as shims. Think of it as a compatibility layer in the style of Wine for .NET-targeted WP games, not Bochs / QEMU.
See Architecture for the pipeline detail.
| Platform | Status |
|---|---|
| Windows 10 (1809+) / 11 | Active development — primary target |
| Android | Experimental; currently launches to a white screen on this fork |
| Linux | Untested (FNA / SDL2 / FFmpeg backend nominally supports it) |
| macOS | Not planned |
See Windows Setup and Android Setup.
WPR's main path is XNA .xap packages for Windows Phone 7. Silverlight
support is experimental — a subset of controls + the Panorama / Pivot
state machine has been written in-tree; many titles still hit unimplemented
controls (LongListSelector, WrapPanel, PhoneTextBox, etc.).
Native WinRT applications (C++/CX) are out of scope — they ship as native PE binaries, not .NET assemblies, so the IL-rewrite approach doesn't apply.
No. WPR's graphics backend is FNA3D, which picks Direct3D 11 on Windows
by default. The native deps (FNA3D.dll, SDL2.dll, FAudio.dll,
FNWP72.dll, ffmpeg.exe) ship next to the executable — there's no system
Vulkan or DirectX prerequisite.
Common patterns:
-
Missing API shim —
MissingMethodExceptionon a method that's referenced by the game but isn't in ourMicrosoft.*/System.*shims yet. - Patcher table miss — type references in the game's IL that we don't redirect to a shim. The IL is rewritten at install time, so adding a redirect needs a reinstall of the affected game (see Architecture).
-
Silverlight control gap — the title uses a Silverlight 4 / WP toolkit
control that's not in
WPR.SilverlightCompabilityyet. - Game-specific assumption about WP7 hardware — accelerometer orientation, memory budget, gamer services, etc.
The first [wpr-ex] line in %LocalAppData%\WPR\Apps\<ProductId>\wpr_game_debug.log
will point at the proximate cause. See Troubleshooting.
| Channel | Path | When |
|---|---|---|
| Host log | UI console / standard Trace listener |
Always |
| Per-game debug log | %LocalAppData%\WPR\Apps\<ProductId>\wpr_game_debug.log |
Debug builds only |
The per-game log is gated by the WprDebugTrace wrapper — Release builds
elide it entirely. Use Debug builds for compat work.
Two paths populate the per-game achievements DB at install time:
-
XnaAchievementCodeExtractor— scans the game's install folder for known patterns (hardcoded catalogue keyed by ProductId, XNA XMLsocialnetworks.xml.xnb, ILldstrnearAwardAchievement*, orContent/Achievements/*.xnbfilenames). - TrueAchievements scrape — best-effort backfill for descriptions and icons.
If your install log shows XnaAchievementCodeExtractor: 0 achievement(s),
all four extractor sources missed for that game. For titles that stash
keys in an inline static array (like PvZ's Sexy.Achievements.ACHIEVEMENT_KEYS),
add an entry to KnownProductCatalogues in XnaAchievementCodeExtractor.cs.
The runtime log line [wpr-trace] BeginGetAchievements: N rows for <ProductId>
confirms what made it into the DB.
| Audio path | Status |
|---|---|
MediaPlayer (background songs) |
Working — Game.Tick auto-pumps FrameworkDispatcher.Update()
|
| Sound effects via SoundEffect/SoundEffectInstance | Working via FAudio |
| XACT (sound banks / wave banks) | Partial — works for some titles, missing features in others |
If a song never plays past the splash, you're probably on a build older
than 21/05/2026 — the FrameworkDispatcher pump fix landed then.
Experimental. The in-tree WPR.SilverlightCompability is a from-scratch
reimplementation of Silverlight 4 / Windows Phone XAML on top of Avalonia.
A small set of controls and the Panorama / Pivot parallax state machine
have been written. Boots a handful of XAPs; the rest hit unimplemented
controls. See the Compatibility List.
| Feature | Status |
|---|---|
| Gamer profile (single signed-in gamer) | Implemented enough to satisfy SignedInGamer / Gamer.SignedInGamers[0]
|
| Achievement read/award (local) | Implemented — backed by SQLite |
| Achievement metadata scrape | Best-effort via TrueAchievements |
| Online multiplayer / friends / messaging | Not implemented; not planned |
| Leaderboards | Partial — LeaderboardReader.get_TotalLeaderboardSize is a notable missing method that breaks Dig It |
WPR does not include or distribute any commercial Windows Phone games.
Users are responsible for legally owning any .xap they import.
Depends on the title. Some .xaps shipped through the Marketplace are
signed but not encrypted, and our installer handles them. Others used
additional DRM that's outside the scope of this project.
Yes — MIT-style permissive licence (see LICENSE in the repo).
Yes. Compat reports, bug reports with logs, missing-shim patches, and documentation improvements are all welcome. See Contributing.
The upstream WPR targeted older .NET + Avalonia 0.9/0.10. The .NET 8 + Avalonia 11.3.9 port modernises the runtime, gives us better tooling (notably the modern Mono.Cecil), and unblocks the Android target rebuild. See the Update History for the migration details.
No. Independent preservation project, not affiliated with Microsoft, Xbox, or Windows Phone.
WPR itself is open-source software. Whether it's legal for you to import
a particular .xap depends on whether you own a licence to that game and
on your jurisdiction. WPR doesn't help with either side of that question.