Reloaded-II 项目结构全解析:Launcher、Loader、Bootstrapper 与工具链体系
发布时间:2026/10/14 3:04:56 锦皓数字建站

游戏开发插件系统开发工具【免费下载链接】Reloaded-IIUniversal .NET Core Powered Modding Framework for any Native Game X86, X64.项目地址https://gitcode.com/gh_mirrors/re/Reloaded-II点击查看免费下载本篇技术指南以 docs/ProjectStructure.md 为骨架系统拆解 Reloaded-IIUniversal .NET Core Powered Modding Framework的仓库组织方式从负责界面与管理的 WPF 启动器Launcher、负责进程内插件化加载的 Mod Loader、用 C 编写的原生注入引导器Bootstrapper到面向 CI/CD 的打包发布工具链以及被复用的若干核心库。读完本文你将能够理清 Reloaded-II 各模块的职责边界与依赖关系理解一个原生游戏进程如何被托管 Mod 框架接管的完整链路并能在浏览仓库时快速定位对应实现。仓库总览一份组件 → 职责 → 实现的索引整个解决方案由source/Reloaded-II.sln组织仓库根目录下还有docs/文档、source/Packages/等目录。ProjectStructure 文档将仓库内容划分为三大板块这与源码目录一一对应Core Components核心组件运行时的骨架包括 Launcher、Loader 与其原生 Bootstrapper。Tools工具面向安装与 CI/CD 场景的独立可执行程序。Libraries库被上述组件复用的类库多数可以脱离 Reloaded-II 单独使用。组件间的关系可以参考仓库中绘制的架构图 Architecture-Diagram-Reloaded-II.pngLauncher 作为图形前端与 Loader 通信Bootstrapper 负责把 Loader 送进目标进程Mods 通过共享接口与 Loader 交互。Reloaded-II 整体架构图核心组件运行时骨架Reloaded.Mod.Launcher Reloaded.Mod.Launcher.LibWPF 启动器启动器是 Reloaded-II 的图形化前端负责管理设置、Mod、已注册的游戏应用并负责加载与和 Mod Loader 通信。它在仓库中被刻意拆成两个工程source/Reloaded.Mod.Launcher纯视图层WPF包括MainWindow.xaml、App.xaml、各页面Pages/如ApplicationPage、ManageModsPage、DownloadPackagesPage、SettingsPage以及大量转换器Converters/与主题资源Theme/。source/Reloaded.Mod.Launcher.Lib真正的逻辑层包括全部ViewModelsModels/ViewModel/、命令Commands/与启动装配逻辑。启动器的启动装配流程集中在 Setup.cs 的SetupApplicationAsync注册Reloaded://、R2Pack://等 URL 协议、检查缺失依赖、后台检查更新、执行健全性检查如为 MS Store/Game Pass 游戏解除保护、检查 Bootstrapper 是否需要更新。启动器运行时会向%APPDATA%\Reloaded-Mod-Loader-II写入核心配置文件并在 Paths.cs 中集中定义这些路径常量。原文档标注Powered by .NET 5.X at the time of last update仓库中多个工程如source/Tools/NuGetConverter/NuGetConverter.csproj的TargetFramework为net5.0可以印证这一点从源码结构看后续演进已引入更高版本 .NET例如 Init.cs 的注释提到 .NET 7因此具体目标框架以当前源码的 csproj 为准。Reloaded.Mod.LoaderMod 加载器本体Loader 是真正加载 Mod的引擎实现位于source/Reloaded.Mod.Loader/。入口为 EntryPoint.cs 中的Initialize它被原生 Bootstrapper 调用后依次完成创建Loader实例 → 将Reloaded.Hooks共享库合并进当前 AssemblyLoadContext → 初始化 Hook、Steam、崩溃/退出钩子 → 加载当前应用的全部启用 ModLoadForCurrentProcess。插件化隔离机制是 Loader 的核心设计每个 Mod 被当作一个独立插件加载。PluginManagerPluginManager.cs基于 McMaster.NETCore.Plugins 构建并为每个 Mod 创建独立的AssemblyLoadContext。隔离的关键实现在 LoadContext.csBuildSharedLoadContext构建一个存放共享接口如IModLoader、IMod的公共上下文BuildModLoadContext为单个 Mod 构建独立上下文通过PreferDefaultLoadContextAssembly把共享类型统一解析到公共上下文。由此Mod A 可以加载Json.NET 10、Mod B 可以加载Json.NET 11即使两个 DLL 同名也不冲突——这正是原文档所述每个 Mod 可以加载各自的依赖而无版本冲突的底层原理。Loader.LoadModsWithDependenciesLoader.cs还会先解析依赖并做拓扑排序保证依赖在依赖者之前加载。Loader 对外的运行时 API 由 LoaderAPI.cs 提供它实现了IModLoader即IModLoaderV4见 IModLoader.cs包含LoadMod/UnloadMod/SuspendMod/ResumeMod/GetLoadedMods定义于 IModLoaderV4.cs以及GetControllerT/MakeInterfacesT等 Mod 间通信能力。Mod 自身需要实现的生命周期接口定义在 IModV1.csStart/Suspend/Resume/Unload/CanUnload/CanSuspend和 IModV2.csStartEx。这些行为均有测试覆盖例如 LoaderTest.cs 验证不同 Mod 的CanSuspend/CanUnload能力LoaderApiTests.cs 验证跨 AssemblyLoadContext 的 Controller 共享。运行时本地服务器Loader 还内置一个本地服务器供 Launcher 等外部客户端访问。服务器协议在source/Reloaded.Mod.Loader.Server/中定义支持SetModStateLoad/Unload/Suspend/Resume见 ModStateType.cs和GetLoadedMods两类消息MessageType.cs。通过该服务器客户端可以在运行时加载、卸载、挂起、恢复 Mod并查询其当前状态ModState.Running/ModState.Suspended见 ModState.cs。此外Loader 还支持原生nativeModPluginManager.PrepareNativeModPluginManager.cs通过 NativeMod.cs 用LoadLibraryW加载原生 DLL并解析ReloadedStart、ReloadedStartEx、ReloadedCanSuspend等约定导出函数把原生 Mod 包装成统一的IModV1接口。这一机制配合ModConfig.json中的ModNativeDll32/ModNativeDll64字段见 ModConfig.cs即可支持 C/C 编写的原生 Mod。Reloaded.Mod.Loader.BootstrapperC 原生引导器Bootstrapper 是一个简单的原生 DLLC工程位于source/Reloaded.Mod.Loader.Bootstrapper/当它被注入进程后负责加载 .NET Runtime 与Reloaded.Mod.Loader。它可以直接被复制用于把 Reloaded 集成进其他加载器。关键实现细节均可在 dllmain.cpp 中确认DLL 入口DllMain收到DLL_PROCESS_ATTACH后调用preload_setup_info随后创建线程执行load_reloaded_async异步加载。路径定位LoaderConfigLoaderConfig.cpp读取%APPDATA%\Reloaded-Mod-Loader-II\ReloadedII.json从中取得LoaderPath32/LoaderPath64/LauncherPath并定位对应的Reloaded.Mod.Loader.dll与.runtimeconfig.json。托管运行时引导CoreCLRCoreCLR.cpp通过hostfxr的hostfxr_initialize_for_runtime_config/hostfxr_get_runtime_delegate拿到load_assembly_and_get_function_pointer最终调用托管入口Reloaded.Mod.Loader.EntryPoint.Initialize方法名在 dllmain.cpp 中硬编码。参数传递原生侧与托管侧通过EntryPointParametersEntryPointParameters.cs当前CurrentVersion 8交换信息包括Version、Flags如LoadedExternally表示由外部加载器注入与DllPath并支持旧版 Bootstrapper 的向下兼容复制。单实例保证通过命名内存映射文件Reloaded-Mod-Loader-Bootstrapper-PID-*确保 Bootstrapper 在进程内只加载一次同时以Reloaded-Mod-Loader-Server-PID-*检测 Loader 是否已在运行dllmain.cpp。关于同步/异步加载由于 Windows DLL Loader Lock加载器锁的存在Bootstrapper 默认只能异步初始化无法保证 Mod 在应用代码之前同步执行。为此它提供了便携模式在 DLL 目录放置ReloadedPortable.txt即触发下的进程重启方案reboot_via_launcher会通过 Launcher 重新拉起目标进程并附带--launch、--arguments、--kill参数dllmain.cpp从而确保 Mod 先于应用代码加载。第三方加载器兼容Bootstrapper 提供自定义入口点以适配常见的 DLL Hijacking 类加载器如 Ultimate ASI Loader——导出InitializeASIdllmain.cpp以及通过 exports.def 为 Sonic 系列社区加载器SA2ModInfo、SADXModInfo 等 MainMemory 系导出兼容符号。这也解释了文档所述可复制到其他加载器无缝集成的能力来源。Reloaded.Mod.Launcher.Kernel32AddressDumper这是 Launcher 启动时执行的一个小型实用程序用途是提取LoadLibraryW函数的地址从而支持从 64 位进程向 32 位进程进行 DLL 注入。LoadLibraryW的 P/Invoke 声明可在 Kernel32.cs 中看到从代码结构看该程序与 Launcher、Loader 共享Reloaded.Mod.Shared工程文档将其列为 Shared 的消费方之一。Tools面向安装与 CI/CD 的独立工具Reloaded.Mod.Installer一键安装器自研的一键安装程序负责安装全部必要依赖并在约一分钟内把 Mod Loader 跑起来。工程位于source/Reloaded.Mod.Installer/入口为 Program.cs优先尝试 CLI 模式Cli.Cli.TryRunCli否则启动 WPF 图形界面。文档注明其基于 .NET 4.7.2任何较新的 Windows 均预装并以Setup.exe形式发布同时通过工程引用链Reloaded.Mod.Installer.csproj引用Reloaded.Mod.Installer.Cli与Reloaded.Mod.Installer.Lib并通过Usings.cs引入DependencyInstaller可以看出它与下文Reloaded.Mod.Installer.DependencyInstaller的协作关系。NuGetConverterNuGet 包转换器用于把 Mod 文件夹或压缩包转换成 NuGet 包的小工具之后可上传到仓库并被 Reloaded 消费。设计意图是无 GUI 的 CI/CD 场景当需要自动生成更新包时用它替代图形界面的打包流程。其命令行为Program.cs 中直接输出Reloaded-II NuGet Package Converter Converts mod folders or archives into NuGet packages. Usage: NuGetConverter.exe Mod Folder or Archive Path Output Path. Example: NuGetConverter.exe Mod.zip Mod.nupkg Example: NuGetConverter.exe reloaded.test.mod reloaded.test.mod.nupkg Example: NuGetConverter.exe reloaded.test.mod ./packages/reloaded.test.mod.nupkg实现上它会根据输入是目录FromModDirectoryAsync还是压缩包FromArchiveFileAsync走不同转换路径并覆盖写输出文件。该工具的目标框架为net5.0见 NuGetConverter.csproj并引用Reloaded.Mod.Loader.Update.Packaging复用其打包逻辑。Reloaded.Publisher无 GUI 发布器同样是面向 CI/CD 的简单程序不依赖完整 Launcher即可生成更新文件与发布产物。入口在 Program.cs使用 CommandLineParser 解析PublishModOptions随后把参数透传给 Publisher.PublishAsync依据ModConfig.json读取 Mod 信息ModId、ModName、ModVersion、ModDescription、ModAuthor等见 ModConfig.cs支持PublishTargetDefault任意非 NuGet 站点、NuGet、GameBanana针对 NuGet 会生成标准 nupkg含 Readme、Icon、依赖组、SupportedAppId 标签针对 GameBanana 会做文件名清洗并标记增量包支持AutomaticDelta自动生成增量包、CompressionLevel默认 Ultra、CompressionMethod默认 Lzma2、OlderVersionFolders指定旧版本目录以计算差量等参数。Libraries可复用的类库Reloaded.Mod.Interfaces接口契约包存放 Mod Loader 各组件的共享接口供 Loader 与外部组件如 Mod 自身共同引用。该包不含任何实现代码只有接口IMod、IModConfig、IModLoader、ILogger、IApplicationConfig、IExports、IConfigurable等目录见source/Reloaded.Mod.Interfaces/也因此是开发一个 Reloaded Mod 的唯一必需引用。文档注明其通常编译为约 8KB 的小型 DLL。值得注意的设计是接口的版本化演进IModV1/IModV2、IModLoaderV1~V4、IModConfigV1~V5等逐层继承IModLoader : IModLoaderV4、IModConfig : IModConfigV5、IMod : IModV1, IModV2既保证了向后兼容又允许新能力渐进加入。Reloaded.Mod.Loader.IO配置读写与监控包含 Reloaded 中所有配置文件的读取与监控代码核心是 ConfigReader.cs 的ConfigReaderTConfigType泛型类支持通配符文件名、递归深度、取消令牌与ConfigServiceBase系服务ApplicationConfigService、ModConfigService、ModUserConfigService以及Paths静态类统一管理的所有路径。文档强调它可以脱离 R-II 作为外部库使用。Reloaded.Mod.Loader.Server远程命令客户端库允许你向存活在某个进程内的 Reloaded 实例发送远程命令。它包含 Mod Loader 服务器的完整实现全部消息Messages/下的Requests/Responses/Structures、消息类型与驱动代码。同时它提供一个功能完整的客户端类抽象基类 ClientBase.cs 封装了GetLoadedModsAsync、LoadModAsync、ResumeModAsync、SuspendModAsync、UnloadModAsync等异步请求方法默认超时 5000ms具体实现 LiteNetLibClient.cs 基于 LiteNetLib 网络库支持密码连接、断线自动重连、连接/断开事件回调。文档特别说明只有 host 类存在于 Mod Loader 本体中——即 Loader 侧仅作为服务器宿主而完整的通信客户端逻辑都收敛在该独立库内。仓库中 Reloaded.Utils.Server 示例 Mod 展示了HandleSetModState对 Load/Unload/Suspend/Resume 四种状态的服务器端处理。Reloaded.Mod.Loader.Update 与 Update.Packaging更新体系Reloaded.Mod.Loader.Update负责获取与应用各 Mod 包的更新。它从 Launcher.Lib 中拆出以便复用内部包含包提供器NuGet / GameBanana / GitHub / Index / Web、依赖解析器AggregateDependencyResolver、包缓存Akavache与增量包读取等模块source/Reloaded.Mod.Loader.Update/。Reloaded.Mod.Loader.Update.Packaging仅包含创建单个更新包所需的代码Publisher.cs是 Update 的子集拆分目的是让工具二进制更小——NuGetConverter 与 Reloaded.Publisher 都只依赖这一小体积子集。Reloaded.Mod.Installer.DependencyInstaller缺失依赖安装器Update 的子集包含搜索缺失依赖并安装的代码拆分目的同样是保持 Reloaded.Mod.Installer 二进制小巧。其核心逻辑在 DependencyInstaller.cs扫描目标文件夹下所有*.runtimeconfig.json排除Apps、Mods、Plugins、User、Theme、Assets等顶层目录用FrameworkFinderDependencyResolver对照本机已安装的 .NET Runtime找出缺失的运行时分别检查 x64 与 x86 两种架构并过滤掉已装 WindowsDesktop Runtime 时可省略的 .NET App Runtime冗余项额外检查 Visual C RedistributableVC2015-2019 x64/x86汇总后以runas提权静默安装/install /quiet /norestart下载与安装阶段通过ProgressSlicer划分进度。Reloaded.Mod.Shared共享代码库存放 Launcher、Loader 与 Kernel32AddressDumper 三者共享的内容——其他库装不下的东西都放这里。典型实现包括EntryPointParameters.cs原生 ↔ 托管之间传递参数的互操作结构上文 Bootstrapper 一节已述Environment.cs运行时环境探测——通过wine_get_version导出判定是否运行于 Wine、通过STEAM_APPID环境变量判定是否运行于 Protontricks并据此决定是否需要 Wine 启动对话框。组件协作全景与阅读路线把以上模块串起来一条完整的运行链路是用户运行 LauncherReloaded.Mod.Launcher它借助Reloaded.Mod.Launcher.Kernel32AddressDumper拿到LoadLibraryW地址向目标游戏进程注入Reloaded.Mod.Loader.Bootstrapper.dllBootstrapperC读取%APPDATA%\Reloaded-Mod-Loader-II\ReloadedII.json定位 Loader 与 .NET 运行时路径加载 hostfxr 并异步调用Reloaded.Mod.Loader.EntryPoint.InitializeLoader 通过PluginManager为每个 Mod 创建独立的AssemblyLoadContext按依赖拓扑依次Start各 Mod并启动本地服务器Launcher 通过Reloaded.Mod.Loader.Server的LiteNetLibClient在运行时对 Mod 执行 Load/Unload/Suspend/Resume 并查询状态开发者侧用Reloaded.Mod.Interfaces编写 Mod用NuGetConverter/Reloaded.Publisher在 CI/CD 中生成 NuGet 包与增量更新用Reloaded.Mod.Installer配合DependencyInstaller在目标机器上一键补齐运行时依赖。对读者而言推荐按以下顺序深入阅读仓库源码先读 PluginManager.cs 与 LoadContext.cs 理解隔离加载核心再读 dllmain.cpp 与 EntryPoint.cs 理解进程接入链路最后结合 LoaderTest.cs 与 LoaderApiTests.cs 验证各行为约定——这套视图/逻辑分层、原生引导、插件隔离、网络驱动、打包更新的结构设计正是理解 Reloaded-II 架构的钥匙。赞分享游戏开发插件系统开发工具【免费下载链接】Reloaded-IIUniversal .NET Core Powered Modding Framework for any Native Game X86, X64.项目地址https://gitcode.com/gh_mirrors/re/Reloaded-II点击查看免费下载相关推荐Reloaded-II 注入方式完全指南Manual Launch、Auto-Inject 与 Bootstrapper DLL 集成Reloaded II 注入方式完全指南Manual Launch、Auto Inject 与 Bootstrapper DLL 集成 Reloaded II游戏开发插件系统开发工具Reloaded-II项目解决P5R游戏通过Reloaded II加载失败问题Reloaded II项目解决P5R游戏通过Reloaded II加载失败问题 问题现象分析 在使用Reloaded II加载器运行修改版《女神异闻录5皇家版游戏开发插件系统开发工具Reloaded-II 项目安装与使用指南Reloaded II 项目安装与使用指南 Reloaded II 是一个强大的游戏模组管理工具特别适合用于管理 Persona 3 Reload 等游戏的模游戏开发插件系统开发工具上一篇免费批量售卖3步清空Steam库存的完整指南下一篇10分钟配好AutoDingding自动打卡备用机无人值守打卡完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。