跳转至

安装与选包

MonoWeaver 发布两个包。它们的 API 完全相同,区别只在编译时链接的 Mono.Cecil 代数。

Mono.Cecil 目标框架
MonoWeaver 0.11.2+ netstandard2.0
MonoWeaver.Cecil10 0.10.00.10.4 netstandard2.0

选哪一个

先看游戏或 Mod Loader 已经加载了哪一代 Cecil,再选包。

  • 老 Unity 游戏、MonoMod 19.xMonoWeaver.Cecil10。两个包都提供 netstandard2.0;Unity 的 .NET 4.x 运行时(2018.1+)自带 netstandard.dll 门面,mod 不需要额外附带任何程序集。
  • 其他情况MonoWeaver
dotnet add package MonoWeaver
dotnet add package MonoWeaver.Cecil10

同时出现两份 Cecil 是最常见的加载失败原因

如果 Mod Loader 已经自带 Mono.Cecil,请先确认版本兼容,不要让自己的 Mod 再带一份不兼容的进去。

命名空间

四个命名空间按职责分开,日常 Hook 一般四个都要:

using System;
using System.Linq;
using Mono.Cecil;
using MonoWeaver.Cecil;
using MonoWeaver.CFG;
using MonoWeaver.Patterns;
命名空间 里面有什么
MonoWeaver.Patterns CilPCilSymbols,以及匹配结果与捕获类型
MonoWeaver.Cecil Match、各种改写操作、RewritePlan
MonoWeaver.CFG VerifyOptionsILMethodVerifier
MonoWeaver.Utils Verify 扩展、Cecil 类型判断辅助

不适用的情况

  • IL2CPP 编译的游戏:没有托管 IL 可读,用不了。
  • 原生代码、混淆到 Cecil 无法解析的程序集。
  • 需要修改的逻辑被内联到调用方之后,原表达式可能已经不存在。

下一步:第一个 Hook