Step 4 of 6 Board up the window
Install BepInEx 6 (IL2CPP x64)
Unpack the loader into the game folder and let it build its interop layer.
This stage has two halves that people often run together and should not. First you unpack files into the game folder, which takes about a minute. Then you launch the game once and let it finish, which takes a few more and does the real work. The mod is not involved yet.
Before you extract
What is in the archive
Open NaziZombiesvHotfix_22-BepInEx-Unity_IL2CPP-win-x64-6_0_0-be_785_6abdba4.zip and you will see six things at the top level. Each
one has a job, and knowing which is which makes the rest of this page — and any
troubleshooting later — much easier.
NaziZombiesvHotfix_22-BepInEx-Unity_IL2CPP-win-x64-6_0_0-be_785_6abdba4.zip — 235 files, 36.3 MB
- winhttp.dll Unity Doorstop 4.5.0. The foothold — Windows loads this before the game does.
- doorstop_config.ini Tells Doorstop what to start and where the runtime lives.
- .doorstop_version Version marker, read by Doorstop.
- changelog.txt The upstream BepInEx changelog. Reference only.
- dotnet A private .NET runtime — this is most of the archive size.
- BepInEx The loader itself.
- core 37 assemblies: the preloader, Harmony, Cecil, Il2CppInterop, Cpp2IL.
- unity-libs The pre-seeded piece. See below.
- 2022.3.62.zip 68 assemblies matched to this game's Unity build.
- plugins Empty. This is where the mod goes in stage two.
- patchers Empty. Nothing in this guide uses it.
The one thing that makes this package different
Stock BepInEx ships unity-libs empty. On its first launch
it works out which Unity version the game was built with and downloads a matching set of
base libraries from the internet, caching them there for next time.
That download is a real failure point. If the machine is offline, behind a restrictive firewall or a corporate proxy, or the upstream host is having a bad day, the first launch produces a broken or empty interop layer — and then the mod loads into nothing and appears to do absolutely nothing, with no obvious error to search for.
This package ships that cache already populated for Unity 2022.3.62, the build this game uses. The first launch reads it off your disk. The download step simply does not happen.
Nothing else has been modified. The core assemblies, Doorstop
4.5.0 and doorstop_config.ini are stock
6.0.0-be.785 as published upstream at commit 6abdba4.
Worth ninety seconds
How the loader gets in
You do not need this to install anything, but it explains why the files go exactly where they go, and it makes the log file readable later.
Windows loads winhttp.dll from the game folder
When a program asks for a system library, Windows looks in the program’s own
folder first. BepInEx ships a stand-in named winhttp.dll, so the game loads
that instead — it forwards every real call onward, so nothing breaks, but it now has
a moment to run first. This is why the file must sit beside
Nazi Zombies.exe and nowhere else.
Doorstop reads doorstop_config.ini
The stand-in is Unity Doorstop 4.5.0. It reads the ini next to it, which names the assembly to start and where to find a .NET runtime:
[General]
enabled = true
target_assembly = BepInEx\core\BepInEx.Unity.IL2CPP.dll
[Il2Cpp]
coreclr_path = dotnet\coreclr.dll
corlib_dir = dotnet
CoreCLR starts from the bundled dotnet folder
The game is IL2CPP, so there is no managed runtime inside it to borrow. Doorstop starts
its own from the dotnet folder in the archive. That folder is why the download
is 36.3 MB for a loader.
BepInEx builds the interop layer
The preloader reads GameAssembly.dll, works out the real shape of the
game’s classes, and writes managed stand-ins into BepInEx\interop.
This is the slow part of the first launch, and the part the pre-seeded
unity-libs makes reliable. GameAssembly.dll is only ever
read.
The chainloader loads your plugins
With interop in place, BepInEx scans BepInEx\plugins and loads every
plugin it finds. On this first launch that folder is empty, which is correct —
the mod arrives in stage two.
Do this now
Install it
Close the game completely
Not minimised, not sitting on the main menu. If the game is running it holds files open, and the paste will fail or half-succeed. Check the taskbar and the system tray.
Open the game root in one window and the archive in another
The game root is the folder containing Nazi Zombies.exe — see
finding the game folder if you are not sure.
Open the ZIP in a second window rather than dragging from inside the archive viewer,
which is where partial extractions come from.
Extract the whole archive into the game root
Select all six top-level items in the archive and extract or copy them into the game
root. Merge when Windows asks. The result you want is
winhttp.dll sitting directly beside Nazi Zombies.exe.
If your archive tool offers Extract Here while you are inside the game folder, that is the shortest path.
Check the layout before you launch
Compare against the tree below. The single most common mistake is ending up with a
nested folder — a NaziZombiesvHotfix_22-BepInEx-Unity_IL2CPP-win-x64-6_0_0-be_785_6abdba4 folder
containing BepInEx, rather than the contents landing loose in the game root.
The game root immediately after extracting — 13 items
- Nazi Zombies_Data was already here
- savedata was already here
- BepInEx added
- core 37 assemblies
- patchers empty
- plugins empty for now
- unity-libs the pre-seeded cache
- dotnet added — the private .NET runtime
- .doorstop_version added
- baselib.dll was already here
- changelog.txt added
- doorstop_config.ini added
- GameAssembly.dll was already here
- Nazi Zombies.exe was already here
- UnityCrashHandler64.exe was already here
- UnityPlayer.dll was already here
- winhttp.dll added — this one must be here
That is exactly what the folder looks like on the machine these screenshots came from. Click the image to open it at full size.
If you see a folder named after the archive, stop
A folder called NaziZombiesvHotfix_22-BepInEx-… inside the game root
means the archive was extracted as a folder rather than into the game
root. Open it, move its six items up one level into the game root, then delete the empty
folder. Nothing will load until this is fixed.
The slow bit
The first launch
Launch the game normally from Steam. This launch is different from every launch after it, and it needs to be allowed to complete.
It will look like it has hung. It has not.
Expect a black window, a stalled splash screen, or an unresponsive title for anywhere from about thirty seconds to a few minutes, depending on your CPU and disk. BepInEx is generating the interop assemblies. Do not alt-F4, do not kill it from Task Manager, do not click anything. Wait until you reach the main menu.
Interrupting it leaves a half-written interop folder, which is genuinely awkward to diagnose later. If you already did, there is a clean fix — it is just easier not to.
Once you reach the main menu, the work is done. Quit back to the desktop. Every launch after this one starts at normal speed, because the interop layer is now cached on disk and only rebuilt if the game updates.
What appeared while you waited
Go back to the game root and open the BepInEx folder. It had four subfolders
when you extracted it; it now has seven and two log files.
<game root>\BepInEx — 9 items after the first launch
- cache created — assembly hashes, so it can skip work next time
- config created — now holds BepInEx.cfg
- core from the archive
- interop created — the generated managed mirror of the game
- patchers from the archive
- plugins from the archive, still empty
- unity-libs from the archive — read, not downloaded
- ErrorLog.log created — errors only
- LogOutput.log created — the full log of the last run
The interop folder is the proof
If BepInEx\interop exists and contains a healthy stack of DLLs —
including Assembly-CSharp.dll and a set of UnityEngine.*.dll
files — the hard part is behind you. An empty or missing interop folder
is the one result that means something went wrong; take it to
troubleshooting.
Optional, strongly recommended
Turn on the console
BepInEx keeps its console window hidden by default. Turning it on gives you a live view of what loaded and what failed, and it is the single most useful thing you can do before installing a plugin — including for the verification step two pages from now.
Open BepInEx\config\BepInEx.cfg
The file did not exist until the first launch. Open it in Notepad or any text editor.
Find the [Logging.Console] section and set Enabled to true
It is near the top. Change the one word:
[Logging.Console]
## Enables showing a console for log output.
# Setting type: Boolean
# Default value: false
Enabled = true
Save the file and launch the game
A console window now opens alongside the game and stays open. It is safe to leave on
permanently; if you find it distracting later, set the value back to false.
What a healthy startup looks like
Four landmarks, in this order. The exact wording shifts a little between builds, so read for the shape rather than matching character for character:
BepInEx 6.0.0-be.785 - Nazi Zombies
Preloader started
Generating Il2Cpp interop assemblies <- only on the first run, or after a game update
Chainloader started
0 / 0 plugins to load <- correct for now; the mod is not installed yet
Chainloader started is the line that matters. It means the
runtime came up, interop is in place, and BepInEx is ready to load plugins. The
0 plugins count is expected at this stage — you have not installed one.
If you would rather not use the console
Everything the console shows is also written to
BepInEx\LogOutput.log after every run, and errors alone are collected in
ErrorLog.log. Opening those in a text editor works just as well; the console
is only more convenient.
Next
Stage one is complete
winhttp.dllsits besideNazi Zombies.exeAlong withdoorstop_config.iniand thedotnetfolder.- The game reached the main menu at least once with BepInEx installedSlowly the first time, normally after that.
BepInEx\interopexists and is not emptyThis is the generated managed mirror of the game.BepInEx\config\BepInEx.cfgexistsWhether or not you enabled the console.BepInEx\pluginsexists and is emptyThat is the folder stage two fills.
All five true? The loader is working. Now install the mod.