.NET静态框架方法重定向/劫持(修改返回值)实现方案咨询
解决方案
方案1:调整AppDomain执行逻辑(无侵入优先推荐)
该方案无需修改系统方法或第三方代码,完全符合.NET运行时规范:
- 不要在主程序的上下文中手动反射调用第三方程序集的EntryPoint,改用
AppDomain.ExecuteAssembly方法直接在新建的AppDomain中执行第三方程序集,此时Assembly.GetExecutingAssembly天然返回第三方程序集本身 - 若需要插入自定义前置执行逻辑,可以将逻辑封装为独立程序集,和第三方程序集一同加载到新建AppDomain中,再通过
AppDomain.CreateInstance在新AppDomain的上下文中触发第三方入口调用,保证执行上下文属于第三方程序集
方案2:运行时Hook系统方法
你之前用的运行时方法替换对Assembly.GetExecutingAssembly无效,是因为该方法属于CLR内部特殊处理的Runtime调用,普通的方法地址替换逻辑无法命中,推荐用成熟的Hook库实现:
- 直接使用
Harmony库,它已经封装了.NET各版本系统方法的Hook兼容逻辑,只需实现自定义补丁方法:
// 自定义补丁方法,返回你预期的第三方程序集实例即可 public static Assembly GetExecutingAssemblyPatch() { return 目标第三方程序集实例; }
- 仅在新建的独立AppDomain中初始化Hook逻辑,避免影响主程序的正常运行
方案3:静态重写第三方程序集
如果允许修改第三方程序集,可以选择该方案,完全没有运行时兼容性问题:
- 用
Mono.Cecil或dnSpy工具打开第三方程序集,全局替换所有调用Assembly.GetExecutingAssembly的IL指令,改为直接返回目标程序集的代码 - 保存修改后的程序集再加载到AppDomain中即可

内容的提问来源于stack exchange,提问作者ShortDevelopment
相关产品推荐
相关产品推荐

