• 注册
  • 攻略教程 攻略教程 关注:711 内容:219

    【教程】借助Mono.Ceil对七日杀Dll文件进行动态AOP

  • 查看作者
  • 打赏作者
  • 当前位置: 七日杀中文网 > 攻略教程 > 正文
  • 攻略教程
  • 大版主
    LV.4
    爱我走心

    之前我们接触过Harmony脚本,但其实归到本质,harmony与monoceil都是通过更改或添加jit生成的汇编代码

    下面举个案例来讲解一下它

    目标:利用Mono.Ceil在指定可方法里面添加一个自定义日志输出

    具体做法:

    1)打开Rider编辑器(或Visual Studio)创建一个新的工程,然后分别引入”Assembly-CSharp”、”Mono.Ceil”和”0Harmony”三个程序集。


    2)创建一个类型,引入HarmonyLib这个命名空间,否则我们无法使用和加载这个自定义脚本。完成后,要使这个类继承于IModApi — 也就是所谓的Mod脚本加载接口,然后我们对其接口进行实现。

    【教程】借助Mono.Ceil对七日杀Dll文件进行动态AOP


    3)上述操作无误后,接下来我们在接口实例函数里面写入以下代码:

    Harmony harmony = new Harmony(base.GetType().Name);//实例化Harmony对象,并把当前实例(通过ID名称)传入harmony脚本的加载对象
    harmony.PatchAll();//表示对程序集中所有找到的补丁方法进行补丁

    4)下面我们利用Mono.Ceil对指定方法进行AOP:

    //读取指定Assembly
    //其中ReadAssembly有两个参数:第一个参数是dll的全路径,第二个参数是dll读取方式设定
    AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(Environment.CurrentDirectory + "/7DaysToDie_Data/Managed/Assembly-CSharp.dll", new ReaderParameters()
    {
          //表示立即读取,而不进行等待
        ReadingMode = ReadingMode.Immediate,
          //表示是否可读可写(操作性)
        ReadWrite = true
    });
    //利用Linq表达式获取要进行AOP的成员(EntityPlayerLocal类下的OnAddedToWorld方法)
    var methAopInstance = assembly.MainModule.Types
        .FirstOrDefault(t => t.Name.EqualsCaseInsensitive(("EntityPlayerLocal")))
        .Methods.FirstOrDefault(m => m.Name.EqualsCaseInsensitive("OnAddedToWorld"));
    //获取当前方法整体的IL交互对象(可以利用它间接进行代码注入)
    var iLWorker = methAopInstance.Body.GetILProcessor();
    //获取当前方法末尾IL所在指令行(最后一行代码)
    var iLStep = methAopInstance.Body.Instructions[methAopInstance.Body.Instructions.Count - 1];
    //定义推送对元数据中存储的"字符串"的新对象引用
    iLWorker.InsertBefore(iLStep, iLWorker.Create(OpCodes.Ldstr, "Hello, custom debug"));
    //定义调用由传递的方法说明符指示的Method,该Debug.Log方法所要传递的参数就是上一步定义推送对元数据中存储的"字符串"的新对象引用-"Hello, custom debug" 
    iLWorker.InsertBefore(iLStep, iLWorker.Create(OpCodes.Call, assembly.MainModule.Import(
        typeof(Debug).GetMethod("Log", new Type[]
        {
            typeof(string)
        }))));
    assembly.Write();
    //写入保存

    5)最后我们封装一下,然后在Mod脚本加载入口InitMod里面去调用这个方法即可!


    以上……

    最终效果:

    【教程】借助Mono.Ceil对七日杀Dll文件进行动态AOP

    游戏运行在F1控制台也会有相应的效果哦。

    "点赞是美意,打赏是鼓励"

    Lv.7
    冲向2023

    大佬666

    人生如戏 漫步人生

    回复
    Lv.5
    别扒拉我

    大佬666

    阿巴阿巴阿巴阿巴

    回复
    Lv.6
    浴火重生

    大佬666

    我是打酱油的

    回复
    LV.4

    大佬666

    回复
    Lv.5
    萌新驾到

    大佬牛逼

    定制加QQ:3181268557

    回复
    Lv.3

    支持大佬 [s-34]

    一个兴趣使然的mod作者(可接简单mod定制)

    回复
    Lv.2

    大佬牛逼,干货已学

    回复
    Lv.6
    别扒拉我
    赠送了礼物[火箭]

    模组制作交流群:720354804

    回复

    老师辛苦了 [s-25]

    回复
    赠送了礼物[鲜花]
    回复
    因恶意刷帖用户过多,本版块已取消回帖金币奖励,请签到获取!>>>金币获取指南<<<

    请登录之后再进行评论

    登录
    • 大版主
    • 小版主
  • yichen
  • 柒月白风清
    柒月白风清
    一只小萌新,万年摸鱼党!已经脱坑了。。。
  • Cure_805
    Cure_805
    晚上在睡觉,白天在工作,不一定能及时回复,有事可以留言!
  • 至善丶丶
    至善丶丶
    群:1050040662 定制/开服/地图制作/价格公道
  • 东方清华EX
    东方清华EX
    一个爱玩七日杀的妹纸
  • 暂没有数据

    赞助广告位

  • 点击展示图片即可一键加入QQ群
    赞助广告:100R/月 目前空缺广告位:0

    分享网站

  • 繁体中文
  • 任务
  • 动态
  • 到底部
  • 帖子间隔 侧栏位置: