Beispiel #1
0
 public static T MethodHook <T>(Class cls, Selector sel, T imp)
     where T : class
 {
     if (imp is Delegate)
     {
         MethodHookInfo info;
         string         name = cls.Name + "|" + sel.Name;
         if (_mHookList.ContainsKey(name))
         {
             info          = _mHookList[name];
             info.hook_imp = imp as Delegate;
             Objc.class_replaceMethod(cls.Handle, sel.Handle, Marshal.GetFunctionPointerForDelegate(info.hook_imp), "@:");
         }
         else
         {
             info          = new MethodHookInfo();
             info.imp_type = typeof(T);
             info.hook_imp = imp as Delegate;
             info.old_imp  = Objc.class_replaceMethod(cls.Handle, sel.Handle, Marshal.GetFunctionPointerForDelegate(info.hook_imp), "@:");
             _mHookList.Add(name, info);
         }
         if (info.old_imp != IntPtr.Zero)
         {
             return(Marshal.GetDelegateForFunctionPointer(info.old_imp, typeof(T)) as T);
         }
     }
     return(null);
 }
Beispiel #2
0
        public static void MethodUnhook(Class cls, Selector sel)
        {
            string name = cls.Name + "|" + sel.Name;

            if (_mHookList.ContainsKey(name))
            {
                MethodHookInfo info = _mHookList[name];
                Objc.class_replaceMethod(cls.Handle, sel.Handle, info.old_imp, "@:");
                _mHookList.Remove(name);
            }
        }