The first launch
This is the run that takes minutes and looks like a hang. It is not a hang. BepInEx is reconstructing 8,187 types out of the game's compiled binary and writing them to disk as real C# assemblies. It happens once, and every plugin you ever install depends on it having finished.
01 Launch the game and leave it alone
Start Deadly Dozen Reloaded from Steam as normal. Then wait, without clicking anything.
On a modern machine with an SSD, expect one to three minutes before the main menu appears. On a mechanical drive, or with an aggressive real-time antivirus scanning every file that gets written, five to ten minutes is not unusual. The window may show nothing at all, or a black screen, or Windows may grey it out and offer to close it.
You will know it worked when the main menu comes up. Quit from the menu. Do not start a mission yet.
02 What actually happened
Four stages, in order. Each one writes something you can go and look at.
| # | Stage | What it does |
|---|---|---|
| 1 | Inject | Doorstop, inside winhttp.dll, starts the CoreCLR runtime from dotnet\ and hands control to BepInEx.Unity.IL2CPP.dll. Milliseconds. |
| 2 | Dump | Cpp2IL reads GameAssembly.dll and global-metadata.dat and reconstructs the type graph as stub assemblies. This is the slow part. |
| 3 | Reference | The pre-seeded unity-libs\2019.4.9.zip is found and extracted for use as reference assemblies. No download — see section 02. |
| 4 | Generate | Il2CppInterop turns the stubs plus the references into real, callable assemblies in BepInEx\interop\. These are what plugins compile and run against. |
Only then does BepInEx load anything from BepInEx\plugins\ — which is empty right
now, and that is why this section comes before the plugin sections rather than after them.
03 The folders that appeared
Open <game folder>\BepInEx. There are now more folders than you copied in.
View at 1920×1080
cache, config, interop and unity-libs carry the first-run timestamp — BepInEx created or filled them itself. core and patchers still carry the build date from the archive.
-
BepInEx\
- cache\ the Cpp2IL stub output and the hash that decides whether to regenerate
-
config\
now contains
BepInEx.cfg— the loader's own settings - core\ unchanged, still carrying the build date from the archive
- interop\ the generated assemblies — the whole point of this launch
- patchers\ still empty, still correct
- plugins\ still empty — sections 04 and 05 fill it
- unity-libs\ your pre-seeded zip, now extracted alongside itself
- LogOutput.log everything that happened, in order
- ErrorLog.log only what went wrong — read this one first
04 Turn on the console
Now that BepInEx\config\BepInEx.cfg exists, you can switch on the console window.
Open the file in Notepad and find the [Logging.Console] section:
[Logging.Console]
## Enables showing a console for log output.
# Setting type: Boolean
# Default value: false
Enabled = true
## Only displays the specified log levels in the console output.
# Setting type: LogLevel
# Default value: Fatal, Error, Warning, Message, Info
LogLevel = Fatal, Error, Warning, Message, Info
Change Enabled from false to true and save. The next launch
opens a black console window beside the game showing everything as it happens.
This is not cosmetic. Every troubleshooting step in section 08 starts with reading a log line, and watching them scroll past in real time tells you which stage a problem lives in far faster than reconstructing it from a file afterwards. Leave it on until the install is finished and working, then turn it off if you find the extra window annoying.
05 Launch again and read the log
Start the game a second time. This launch should reach the main menu at close to normal speed — the expensive work is cached now. With the console on, you are looking for a banner and a plugin count:
[Message: BepInEx] BepInEx 6.0.0-be.785 - DeadlyDozenReloaded
[Info : BepInEx] Running under Unity v2019.4.9
[Info : BepInEx] CLR runtime version: …
[Message: BepInEx] Preloader started
[Info : Il2CppInterop] Using cached interop assemblies
[Message: BepInEx] Chainloader ready
[Message: BepInEx] 0 plugins to load
0 plugins to load is the correct and expected result at this point.
You have not installed any yet. What matters is that the line exists at all — it means the
chainloader started, looked in plugins\, and is ready to load whatever it finds
there next time.
Before moving on
0 of 6 confirmed