MonkeyLoader 0.28.2-beta
dotnet add package MonkeyLoader --version 0.28.2-beta
NuGet\Install-Package MonkeyLoader -Version 0.28.2-beta
<PackageReference Include="MonkeyLoader" Version="0.28.2-beta" />
<PackageVersion Include="MonkeyLoader" Version="0.28.2-beta" />
<PackageReference Include="MonkeyLoader" />
paket add MonkeyLoader --version 0.28.2-beta
#r "nuget: MonkeyLoader, 0.28.2-beta"
#:package MonkeyLoader@0.28.2-beta
#addin nuget:?package=MonkeyLoader&version=0.28.2-beta&prerelease
#tool nuget:?package=MonkeyLoader&version=0.28.2-beta&prerelease
MonkeyLoader
<img align="right" width="128" height="128" src="./Icon.png"/>
A convenience and extendability focused mod loader using NuGet packages.
Online Documentation is here.
Quick Links
What's this?
MonkeyLoader is a mod loader that aims to combine easy usability for developers and users, while also offering a feature rich platform. It started with me wanting to use the break in mod compatibility, caused by the release of Resonite, to develop something with support for pre-patching (modifying assemblies before they're loaded), without relying on the game's plugin system, and with a focus on improving dependency resolution.
To start with this, I asked other active developers in the general modding community, what they would like to see as features in a new mod loader. It became clear, that main requests were:
- Being able to use it as a library from a custom launcher
- Automatic load order and patch sorting
- Easy distribution of assets with mods, without messy files
- Dependency resolution capabilities
Using NuGet packages (.nupkg) files to distribute and load mods from came as a natural conclusion from the last two points. As fancy zip files, they make it easy to bundle assets (like debug symbols, 3D models, textures, ...) for the mod into one file, without creating an enormous and opaque DLL file. Further, they include metadata that can be read without having to load the DLLs, which allows checking whether all dependencies are available and otherwise restoring them. For mod distribution and dependency resolution, custom NuGet feeds can be used: Mod authors can have their own feeds for mods, and community groups could set up feeds for "vetted" builds as well. Other general libraries can be loaded from custom feeds or the general nuget.org one too.
Features
Below you can find an overview of the (planned) features. Help is always wanted and appreciated, feel free to ask here, or on Telegram or Discord.
- Fully usable as a library by custom launchers / wrappers
- Multiple, configurable loading locations for mods
- Add mods and their dependencies from customizable NuGet feeds (not yet)
- Pre-patching of assemblies - modify the IL that gets loaded
- Game specific integration through GamePacks
- Extra hooks, JsonConverters, feature lists, etc.
- Configuration system with config files for each mod
- Load mods in topological order (respecting dependencies)
- Otherwise smartly order mods' patchers based on which features they affect how much
How it Works
This is the order of operations that MonkeyLoader executes on startup:
- Catalogue all assemblies of the game
- Load the metadata of all GamePacks and mods
- Load and run the pre-patchers of GamePacks, then of mods
- Save all modified assemblies to disk and load all assemblies of the game
- Load and run the patchers of GamePacks, then of mods
After that, the game can proceed with its initialization and startup. GamePacks may provide extra hooks for patchers that need some things to already be set up. For example the Unity pack ads a hook for patching after the first scene has been loaded - otherwise, the dynamic binding of Unity engine methods fails and everything breaks.
Creating a Mod
Someone from the Resonite community has created a Template, which covers both the regular RML and MonkeyLoader.
Otherwise, the general steps are:
- Create a class library in Visual Studio, targeting the .net version of the game
- Reference MonkeyLoader from NuGet (eventually, for now from your install)
- Reference the GamePacks you need from NuGet (eventually, for now from your install)
- Make sure to split up pre-patcher and patcher assemblies
- Pre-patchers must not reference any game assemblies directly, or pre-patching won't work
- (Automatically) create a .nupkg with your assemblies and place it into the ./MonkeyLoader/Mods/ folder (by default)
- When you now start the game, your mod should be loaded and patches should be applied
For more detail, you can take a look into the Resonite.Integration for now. I will update this readme with an actual MVP eventually and link to other examples.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 is compatible. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 is compatible. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.6.2
- Ben.Demystifier (>= 0.4.1)
- EnumerableToolkit.Builder (>= 2.1.0)
- EnumerableToolkit.Builder.Async (>= 2.1.0)
- Lib.Harmony.Thin (>= 2.4.2)
- Newtonsoft.Json (>= 13.0.4)
- NuGet.Protocol (>= 6.14.0)
- System.Formats.Asn1 (>= 8.0.2)
- System.Text.Json (>= 10.0.0)
- Zio (>= 0.22.1)
-
.NETStandard 2.0
- Ben.Demystifier (>= 0.4.1)
- EnumerableToolkit.Builder (>= 2.1.0)
- EnumerableToolkit.Builder.Async (>= 2.1.0)
- Lib.Harmony.Thin (>= 2.4.2)
- Newtonsoft.Json (>= 13.0.4)
- NuGet.Protocol (>= 6.14.0)
- System.Formats.Asn1 (>= 8.0.2)
- System.Text.Json (>= 10.0.0)
- Zio (>= 0.22.1)
-
net10.0
- Ben.Demystifier (>= 0.4.1)
- EnumerableToolkit.Builder (>= 2.1.0)
- EnumerableToolkit.Builder.Async (>= 2.1.0)
- Lib.Harmony.Thin (>= 2.4.2)
- Newtonsoft.Json (>= 13.0.4)
- NuGet.Protocol (>= 6.14.0)
- System.Formats.Asn1 (>= 8.0.2)
- System.Text.Json (>= 10.0.0)
- Zio (>= 0.22.1)
-
net5.0
- Ben.Demystifier (>= 0.4.1)
- EnumerableToolkit.Builder (>= 2.1.0)
- EnumerableToolkit.Builder.Async (>= 2.1.0)
- Lib.Harmony.Thin (>= 2.4.2)
- Newtonsoft.Json (>= 13.0.4)
- NuGet.Protocol (>= 6.14.0)
- System.Formats.Asn1 (>= 8.0.2)
- Zio (>= 0.22.1)
-
net6.0
- Ben.Demystifier (>= 0.4.1)
- EnumerableToolkit.Builder (>= 2.1.0)
- EnumerableToolkit.Builder.Async (>= 2.1.0)
- Lib.Harmony.Thin (>= 2.4.2)
- Newtonsoft.Json (>= 13.0.4)
- NuGet.Protocol (>= 6.14.0)
- System.Formats.Asn1 (>= 8.0.2)
- Zio (>= 0.22.1)
-
net7.0
- Ben.Demystifier (>= 0.4.1)
- EnumerableToolkit.Builder (>= 2.1.0)
- EnumerableToolkit.Builder.Async (>= 2.1.0)
- Lib.Harmony.Thin (>= 2.4.2)
- Newtonsoft.Json (>= 13.0.4)
- NuGet.Protocol (>= 6.14.0)
- System.Formats.Asn1 (>= 8.0.2)
- System.Text.Json (>= 8.0.5)
- Zio (>= 0.22.1)
-
net8.0
- Ben.Demystifier (>= 0.4.1)
- EnumerableToolkit.Builder (>= 2.1.0)
- EnumerableToolkit.Builder.Async (>= 2.1.0)
- Lib.Harmony.Thin (>= 2.4.2)
- Newtonsoft.Json (>= 13.0.4)
- NuGet.Protocol (>= 6.14.0)
- System.Formats.Asn1 (>= 8.0.2)
- System.Text.Json (>= 8.0.5)
- Zio (>= 0.22.1)
-
net9.0
- Ben.Demystifier (>= 0.4.1)
- EnumerableToolkit.Builder (>= 2.1.0)
- EnumerableToolkit.Builder.Async (>= 2.1.0)
- Lib.Harmony.Thin (>= 2.4.2)
- Newtonsoft.Json (>= 13.0.4)
- NuGet.Protocol (>= 6.14.0)
- System.Formats.Asn1 (>= 8.0.2)
- System.Text.Json (>= 9.0.1)
- Zio (>= 0.22.1)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on MonkeyLoader:
| Package | Downloads |
|---|---|
|
MonkeyLoader.GamePacks.Resonite
This Game Pack for MonkeyLoader provides basic hooks for modding the game Resonite, which uses FrooxEngine. It provides hooks for the beginning of initialization, when initialization is done, and when the game shuts down. Additionally it contains many useful features for Users and Developers alike. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.28.2-beta | 158 | 12/4/2025 |
| 0.28.1-beta | 138 | 11/28/2025 |
| 0.28.0-beta | 133 | 11/25/2025 |