BepInEx 6.0 排查手册:让 Unity 模组在 IL2CPP 游戏里稳定跑起来的完整修复路径

📅 2026/8/24 16:34:52
BepInEx 6.0 排查手册:让 Unity 模组在 IL2CPP 游戏里稳定跑起来的完整修复路径
BepInEx 6.0 排查手册让 Unity 模组在 IL2CPP 游戏里稳定跑起来的完整修复路径【免费下载链接】BepInExUnity / XNA game patcher and plugin framework项目地址: https://gitcode.com/GitHub_Trending/be/BepInExBepInEx 是面向 Unity 模组的插件框架这篇手册按你会真实撞上的故障来讲它注入 IL2CPP 编译游戏时的三类典型问题日志第一行怎么读、插件列表为什么是空的、互操作程序集过期后如何重新生成。每个结论都给了可以直接执行的检查点不绕理论。先搞懂为什么 IL2CPP 比 Mono 难搞一句话版本Mono 运行时在内存里跑的是 IL 字节码随时可以动态塞新类型进去而 IL2CPP 把 C# 代码提前编译成了 C 原生代码类型表在编译时就固定了运行时想临时加一个类就没那么容易了。BepInEx 的解法是启动游戏前先用 Cpp2IL 反汇编出元数据再由 Il2CppInterop 动态生成一批互操作程序集把原生 C 类型伪装成普通 C# 类型供插件调用。这套流程发生在插件加载之前所以 IL2CPP 下的绝大多数故障根子都在互操作程序集没有生成、生成不完整、或者游戏更新后过期了这三件事上。后面所有排查都围绕这条主线展开。出事后先看日志第一行在哪 定位问题前先确认三件事日志文件在哪里默认在BepInEx/LogOutput.log如果 doorstop 配置里redirect_output_log true则 Unity 引擎日志会重定向到output_log.txt启动方式对不对IL2CPP 游戏靠 doorstop 拦截启动配置项target_assembly必须指向BepInEx/core/BepInEx.Unity.IL2CPP.dll注意是core小写目录平台是否受支持IL2CPP 后端目前只覆盖Windows 64 位和LinuxmacOS 不在支持列表里别在这上面浪费时间如果日志里出现Class::Init signatures have been exhausted这类签名耗尽警告通常意味着动态类型/签名池不够用——升级 BepInEx 到当前版本构建入口 BepInEx.sln6.0.0 版本的 IL2CPP 目标框架为 .NET 6.0是最直接的办法仍复现的话检查是否有插件在启动时疯狂反射创建委托。插件加载数量为 0 的排查清单插件数为 0 是 IL2CPP 环境最高频的故障。按命中概率从高到低排现象最可能的原因去哪确认日志直接停在 doorstop 阶段enabled false或target_assembly路径写错doorstop_config.ini的[General]段启动窗口一闪就关coreclr_path/corlib_dir指向不存在的 dotnet 目录[Il2Cpp]段默认分别是dotnet\coreclr.dll和dotnet框架启动了但 Loaded 插件数为 0插件 DLL 没引用 BepInEx.Core或 GUID/版本缺失日志里的Skipping over type警告部分插件被跳过且提示版本问题插件是按 BepInEx 5 编译的与 6.0 不兼容重新用 6.0 的 API 编译插件链式加载器链式加载器源码跳过插件时会给出非常明确的日志照抄原文方便检索Skipping over type [xxx] as no metadata attribute is specified—— 插件类上缺[BepInPlugin]特性Skipping type [xxx] because its GUID [xxx] is of an illegal format—— GUID 只能包含字母、数字、.、_、-版本不匹配 —— 插件编译时引用的 BepInEx.Core 大版本与当前框架不一致doorstop 配置到底改哪几处Windows/macOS 下改doorstop_config.ini配置与启动脚本源码Linux/macOS 则用仓库自带的run_bepinex_il2cpp.sh启动脚本。无论哪种真正起作用的就下面这几项[General] enabled true target_assembly BepInEx\core\BepInEx.Unity.IL2CPP.dll [Il2Cpp] coreclr_path dotnet\coreclr.dll corlib_dir dotnet改完保存即可不用额外操作。Linux 用户注意启动脚本里coreclr_path是不带扩展名的dotnet/libcoreclr脚本会自动拼.so/.dylib并且需要填好executable_name指向游戏的可执行文件。从源码构建的话克隆仓库后直接编译整个解决方案即可# 克隆仓库并编译 6.0 版本 git clone https://gitcode.com/GitHub_Trending/be/BepInEx cd BepInEx dotnet build BepInEx.sln -c Release产物会落在各项目的$(BuildDir)输出目录IL2CPP 目标在BuildDir/Unity.IL2CPP把core/、dotnet/、plugins/目录连同 doorstop 配置一起放进游戏根目录就是完整部署。互操作程序集过期判断与重新生成游戏一旦更新global-metadata.dat就变了旧的互操作程序集全部作废。框架的互操作管理器IL2CPP 互操作层源码会用哈希值记录当前程序集对应的元数据存在BepInEx/interop/assembly-hash.txt哈希不匹配时如果BepInEx.cfg里IL2CPP.UpdateInteropAssemblies true默认开启下次启动会自动重新跑 Cpp2IL 并重建interop/目录——首次可能需要几分钟这期间启动慢是正常现象。判断卡住还是正常重建日志停在互操作生成阶段且 CPU 占用高 → 在干活等它反复重建或生成后插件依旧报错 → 检查IL2CPP.GlobalMetadataPath是否指向了真实的il2cpp_data/Metadata/global-metadata.dat以及dotnet/核心库目录是否完整。收尾验证三件事确认闭环游戏能进主菜单不等于注入成功最后花一分钟确认控制台/日志中出现Loaded X plugin(s)且 X 与你放进plugins/的插件数一致output_log.txt和LogOutput.log里搜不到exhausted、Could not find等字样BepInEx/interop/目录下有当天的互操作 DLL说明重新生成已完成记住这条主线就行IL2CPP 下的问题九成出在 doorstop 拦截 → 互操作程序集生成 → 插件链式加载这三段的衔接处日志会明确告诉你是哪一段断了照着上面的清单修基本都能闭环。【免费下载链接】BepInExUnity / XNA game patcher and plugin framework项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考