WinAppMigrator

Runtimes

Many apps rely on shared pieces from Microsoft that are installed separately, such as the Visual C++ runtime or .NET. These are runtimes. An app copied without them will not start. WinAppMigrator finds which runtimes an app needs, and makes sure the installer can provide them on the new PC, even with no internet there. There is one exception, the DirectX End-User Runtime, which needs internet there.

Which Runtimes It Knows

Runtime How it is provided
Visual C++ 2005, 2008, 2010, 2012, 2013, and 2015 and later Downloaded from Microsoft when you build, and put inside the installer
.NET 6, 7, 8, 9, and 10, including the Desktop and ASP.NET Core runtimes Downloaded from Microsoft when you build, and put inside the installer
.NET Framework 3.5 Turned on as a Windows feature on the new PC. That can need internet, or Windows install media.
.NET Framework 4 Part of Windows 10 and 11, so nothing is installed. It is listed so you know. The installer checks for 4.8. On an older Windows 10 without it, it only notes that you need to install it.
DirectX End-User Runtime (June 2010) Microsoft's web installer for it is downloaded when you build, and put inside the installer. On the new PC, that fetches the runtime from Microsoft, so it needs internet there. See below.

The app reads what the main program needs, and up to 64 of the app's other programs, nearest the top of its folder first. If there are more, the screen says how many were not looked at. One app can have a .NET launcher and a Visual C++ engine, or a 32-bit program beside a 64-bit one, and each needs its own runtime. Programs that only exist to install or update the app are not counted.

A runtime is always included, even if what needed it was in a folder you unticked. Telling whether anything else still needs it would take more than the screen can know, and it only costs room.

At Build Time

When you click Create Installer, the step "Bundling runtimes and drivers…" downloads each runtime's installer from Microsoft, over HTTPS only, and checks it is signed by Microsoft. If it is, it goes inside the installer.

This needs internet on the PC you build on. If a download fails, or what came down is not signed by Microsoft, the build still finishes, and the installer will try winget on the new PC instead, which needs internet there. The done screen's Warnings then says so, for example "Could not download" a runtime, and "the installer will try winget on the target." To have it inside, build again while online.

When working out the room a build needs, each runtime it will download is counted as 150 MiB.

On the Screen

Before you build, What It Needs to Run lists each runtime and how it will be provided. The installer's Dependencies card shows the same. The labels are:

Label Meaning
Included Inside the installer. It installs without internet, except the DirectX End-User Runtime. (Before you build, this means it will be downloaded and put inside.)
Installed with winget: and an id It is not inside, so the installer uses winget on the new PC. This needs internet there.
Windows Feature: NetFx3 .NET Framework 3.5, turned on through Windows itself
Built into Windows .NET Framework 4
Ships with the App The app carries its own copy, so nothing is needed
Install Manually There is no installer for it here. Install it yourself before running the app.

On the New PC

Runtimes are the first thing the installer installs, shown as "Installing runtimes". For each one, the installer:

  1. checks, where it can, whether this PC already has it, and skips it if so;
  2. checks again that the installer file it carries is signed by Microsoft, just before running it;
  3. runs it quietly, with settings built into WinAppMigrator, not taken from the package.

Visual C++ 2005 and 2008, .NET 6 to 10, and the DirectX End-User Runtime have no check here for whether they are already there, so their installers always run. A .NET installer run where that runtime is already installed just exits, and the DirectX one finds nothing to fetch.

If this PC already has a Visual C++ runtime, but an older one than the installer carries, the installer's newer one is installed.

If a runtime cannot be installed, the install fails, and everything it did is put back, except any runtime it had already installed. The message says which runtime, why, and where Microsoft offers it. A runtime marked Install Manually is the exception: the installer has nothing to run for it, so it only notes that.

If a runtime asks for a restart, the result says "A dependency needs a reboot to finish. Restart Windows, then launch the app."

With No Internet on the New PC

Runtime Works without internet?
Visual C++ or .NET 6 to 10, marked Included Yes. It is inside the installer.
One marked Installed with winget No. winget needs internet, and has to be on the PC. If it cannot install the runtime, the install fails and is put back. Install the runtime yourself first, or build the installer again on a PC with internet so that the runtime goes inside.
.NET Framework 3.5 Maybe not. Windows may need to download it, or need install media. If Windows cannot turn it on, the install fails and is put back.
.NET Framework 4 Nothing to install
The DirectX End-User Runtime No. What is inside the installer only fetches the runtime from Microsoft.

The DirectX End-User Runtime

Many games, and some other apps, made for Windows XP and Windows 7, use parts of DirectX that no Windows has ever come with, such as d3dx9_43.dll, xinput1_3.dll, and xaudio2_7.dll. Microsoft's DirectX End-User Runtime of June 2010 put them on a PC, usually from a game's setup, so most Windows 7 PCs had them. Newer ones, such as xinput1_4.dll and d3dcompiler_47.dll, come with Windows 8 and later, and are not counted.

If one of the app's programs needs one of these files, and does not carry its own copy beside it, the app needs this runtime. It is listed as "DirectX End-User Runtime (June 2010)", marked Included.

What goes inside the installer is Microsoft's web installer, dxwebsetup.exe, which is checked as signed by Microsoft like every other runtime's installer. On the new PC it runs quietly, and fetches from Microsoft the parts that PC does not have. So:

If it could not be downloaded when you built, the installer tries winget instead, as for any runtime.

What It Cannot Provide

These are named in a warning, and nothing is installed in their place:

Other runtimes are detected and listed, but not installed. A Java runtime the app carries with it shows Ships with the App. If the app has Java's launcher but not the runtime itself, it shows Install Manually. Python and Electron apps carry their own, and show Ships with the App. Java and Python are only noticed by files in the app's own folders: an app that relies on a Java or Python installed elsewhere on the PC, with none of it in its folders, shows nothing, so install that yourself.

Runtimes Stay

A runtime the installer adds stays when you uninstall the app, and stays after a failed install is put back, because other programs may be using it. The uninstaller says which runtimes it is leaving.

Safety

Which installer runs for each runtime, and with what settings, is built into WinAppMigrator itself. A package can only say which runtime it needs, never what to run. Every runtime installer must be validly signed by Microsoft when it is downloaded and again just before it runs. What winget fetches is winget's own to check, and winget's own signature is checked first.

What Has Been Tested for Real

Be aware of how far testing goes. On GitHub's machines, of the runtimes it can install, only the x64 Visual C++ 2015 and later has been installed for real, on a test machine it was first taken off. A real app's installer, built with that runtime inside, was shown to fail without it, and to work after the install.

Every other runtime's download is fetched and checked as Microsoft's on each test run, but not installed. The winget route and the Windows feature route have not been run.

By hand, away from GitHub's machines, an installer built from a Windows 7 virtual machine installed the DirectX End-User Runtime on Windows 11 25H2, and the small test app that needed it ran. See Requirements and testing.

Last changed 2026-11-11. Describes WinAppMigrator as of its latest release, 0.6.0.