CLR重定向
在开发中,如ILRuntime的反射那篇文档中说的,一些依赖反射的接口是没有办法直接运行的,最典型的就是在Unity主工程中通过new T()创建热更DLL内类型的实例。
细心的朋友一定会好奇,为什么Activator.CreateInstance
ILRuntime为了解决这类问题,引入了CLR重定向机制。 原理就是当IL解译器发现需要调用某个指定CLR方法时,将实际调用重定向到另外一个方法进行挟持,再在这个方法中对ILRuntime的反射的用法进行处理
刚刚提到的Activator.CreateInstance
public static StackObject* CreateInstance(ILIntepreter intp, StackObject* esp, List<object> mStack, CLRMethod method, bool isNewObj) |
要让这段代码生效,需要执行相对应的注册方法:
foreach (var i in typeof(System.Activator).GetMethods()) |
带参数的方法的重定向
刚刚的例子当中,由于CreateInstance
public unsafe static StackObject* DLog(ILIntepreter __intp, StackObject* __esp, List<object> __mStack, CLRMethod __method, bool isNewObj) |
然后在通过下面的代码注册重定向即可:
appdomain.RegisterCLRMethodRedirection(typeof(Debug).GetMethod("Log"), DLog); |