Пример #1
0
        public List <Instruction> prepareEventHook(MethodDefinition mdef, string _event, Instruction[][] argLoaders)
        {
            MethodDefinition fireEvent = HelperClass.findMember <MethodDefinition>(skModule, "SurvivalKit.Events.EventManager", false,
                                                                                   HelperClass.MemberNameComparer <MethodDefinition>("FireEvent"),
                                                                                   HelperClass.MethodParameterNamesComparer("name", "pars"));

            if (fireEvent == null)
            {
                throw new Exception("Unable to find SurvivalKit.Events.EventManager.FireEvent(string,object[])!");
            }

            ILProcessor        proc = mdef.Body.GetILProcessor();
            List <Instruction> hook = new List <Instruction>();

            hook.Add(proc.Create(OpCodes.Ldstr, _event));
            hook.Add(proc.Create(OpCodes.Ldc_I4, argLoaders.Length));
            hook.Add(proc.Create(OpCodes.Newarr, csModule.Import(mscorlibModule.GetType("System.Object"))));
            int dataIndex = 0;

            //addToArray(proc, hook, dataIndex++, new Instruction[] { proc.Create(OpCodes.Ldarg_0) });
            for (int i = 0; i < argLoaders.Length; i++)
            {
                addToArray(proc, hook, dataIndex++, argLoaders[i]);
            }
            hook.Add(proc.Create(OpCodes.Call, csModule.Import(fireEvent)));
            return(hook);
        }