private void InjectReturnHook(MethodReference methodRef, bool haveReturnValue) { try { foreach (var typeDef in m_ModuleDefinition.Types) { if (ScriptProcessor.DontInjectTypes.Contains(typeDef.FullName)) { continue; } if (!ScriptProcessor.CheckType(typeDef, methodRef)) { continue; } foreach (var methodDef in typeDef.Methods) { var fullName = methodDef.FullName; if (fullName == methodRef.FullName) { continue; } if (ScriptProcessor.DontInjectMethods.Contains(fullName)) { continue; } if (!ScriptProcessor.CheckMethod(methodDef, methodRef)) { continue; } var body = methodDef.Body; body.InitLocals = true; var ilProcessor = body.GetILProcessor(); body.Variables.Add(new VariableDefinition(m_ObjectArrayTypeRef)); int arrLocalIndex = body.Variables.Count - 1; int ct = methodDef.Parameters.Count; var insertPoint = FindRet(body, null); while (null != insertPoint) { insertPoint.OpCode = OpCodes.Nop; insertPoint.Operand = null; var newRet = ilProcessor.Create(OpCodes.Ret); ilProcessor.InsertAfter(insertPoint, newRet); insertPoint = newRet; AddReturnHook(arrLocalIndex, ct, methodDef, methodRef, haveReturnValue, insertPoint, ilProcessor); insertPoint = FindRet(body, insertPoint); } } } } catch (Exception ex) { ScriptProcessor.ErrorTxts.Add(string.Format("InjectPrologue({0}), exception:{1}\n{2}", methodRef.FullName, ex.Message, ex.StackTrace)); } }
private void InjectMemoryLog(MethodReference methodRef, bool haveReturnValue) { try { foreach (var typeDef in m_ModuleDefinition.Types) { if (ScriptProcessor.DontInjectTypes.Contains(typeDef.FullName)) { continue; } if (!ScriptProcessor.CheckType(typeDef, methodRef)) { continue; } foreach (var methodDef in typeDef.Methods) { var fullName = methodDef.FullName; if (fullName == methodRef.FullName) { continue; } if (ScriptProcessor.DontInjectMethods.Contains(fullName)) { continue; } if (!ScriptProcessor.CheckMethod(methodDef, methodRef)) { continue; } var body = methodDef.Body; if (HaveNew(methodDef)) { string tag = CalcTag(methodDef); var ilProcessor = body.GetILProcessor(); var insertPoint = body.Instructions[0]; if (insertPoint.OpCode == OpCodes.Nop) { insertPoint = body.Instructions[1]; } else { ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Nop)); } ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Ldc_I4_0)); ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Ldstr, tag)); ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Call, methodRef)); if (haveReturnValue) { ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Pop)); } //退出前再调用一次 insertPoint = FindRet(body, null); while (null != insertPoint) { insertPoint.OpCode = OpCodes.Nop; insertPoint.Operand = null; var newRet = ilProcessor.Create(OpCodes.Ret); ilProcessor.InsertAfter(insertPoint, newRet); insertPoint = newRet; ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Ldc_I4_1)); ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Ldstr, tag)); ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Call, methodRef)); if (haveReturnValue) { ilProcessor.InsertBefore(insertPoint, ilProcessor.Create(OpCodes.Pop)); } insertPoint = FindRet(body, insertPoint); } } } } } catch (Exception ex) { ScriptProcessor.ErrorTxts.Add(string.Format("InjectPrologue({0}), exception:{1}\n{2}", methodRef.FullName, ex.Message, ex.StackTrace)); } }