private static void SetupBaseModuleTypes() { ChannelMessageType = BaseAssembly.MainModule.GetType("Nice.Game.Base.ChannelMessage"); ChannelMessageBufferField = ResolveHelper.ResolveField(ChannelMessageType, "Buffer"); ByteBufferType = BaseAssembly.MainModule.GetType("Nice.Game.Base.ByteBuffer"); ByteBufferAllocateMethod = ResolveHelper.ResolveMethod(ByteBufferType, "Allocate"); ByteUtilsType = BaseAssembly.MainModule.GetType("Nice.Game.Base.ByteUtils"); ByteUtilsReadMethod = ResolveHelper.ResolveMethod(ByteUtilsType, "Read"); ByteUtilsWriteMethod = ResolveHelper.ResolveMethod(ByteUtilsType, "Write"); ByteBufferUtilsType = BaseAssembly.MainModule.GetType("Nice.Game.Base.ByteBufferUtils"); ByteBufferUtilsReadMethod = ResolveHelper.ResolveMethod(ByteBufferUtilsType, "Read"); ByteBufferUtilsWriteMethod = ResolveHelper.ResolveMethod(ByteBufferUtilsType, "Write"); SendType = BaseAssembly.MainModule.GetType("Nice.Game.Base.SendAttribute"); RecvType = BaseAssembly.MainModule.GetType("Nice.Game.Base.RecvAttribute"); ProtocolType = BaseAssembly.MainModule.GetType("Nice.Game.Base.AutoProtocolAttribute"); BroadcastType = BaseAssembly.MainModule.GetType("Nice.Game.Base.BroadcastAttribute"); SyncClassType = BaseAssembly.MainModule.GetType("Nice.Game.Base.SyncClassAttribute"); SyncFieldType = BaseAssembly.MainModule.GetType("Nice.Game.Base.SyncFieldAttribute"); AbsCopType = BaseAssembly.MainModule.GetType("Nice.Game.Base.AbsCop"); AbsCopOnRemoveMethod = ResolveHelper.ResolveMethod(AbsCopType, "OnRemove"); AbsCopGetEntityMethod = ResolveHelper.ResolveMethod(AbsCopType, "get_Entity"); IConnectionType = BaseAssembly.MainModule.GetType("Nice.Game.Base.IConnection"); IConnectionRegisterHandlerMethod = ResolveHelper.ResolveMethod(IConnectionType, "RegisterHandler"); IConnectionUnregisterHandlerMethod = ResolveHelper.ResolveMethod(IConnectionType, "UnRegisterHandler"); NetworkClientManagerType = BaseAssembly.MainModule.GetType("Nice.Game.Base.NetworkClientManager"); NetworkClientManagerSendMethod = ResolveHelper.ResolveMethod(NetworkClientManagerType, "Send"); NetworkServerManagerType = BaseAssembly.MainModule.GetType("Nice.Game.Base.NetworkServerManager"); NetworkServerManagerSendMethod = ResolveHelper.ResolveMethod(NetworkServerManagerType, "Send"); NetworkServerManagerBroadcastMethod = ResolveHelper.ResolveMethod(NetworkServerManagerType, "Broadcast"); }
public static FieldDefinition CreateField(ModuleDefinition module, TypeDefinition type, string fieldName, FieldAttributes attributes, TypeReference fieldType) { FieldDefinition field = ResolveHelper.ResolveField(type, fieldName); if (field == null) { field = new FieldDefinition(fieldName, attributes, fieldType); type.Fields.Add(field); } return(field); }
public static void Weave(ModuleDefinition module, Dictionary <ushort, MethodDefinition> methods, TypeDefinition protocol) { if (module == null || methods.Count == 0 || protocol == null) { return; } FieldReference connectionField = module.ImportReference(ResolveHelper.ResolveField(protocol.BaseType, "m_Connection")); { //public void Register(); MethodDefinition registerMethod = ResolveHelper.ResolveMethod(protocol, "Register"); registerMethod.Body.Variables.Clear(); registerMethod.Body.Instructions.Clear(); ILProcessor registerProcessor = registerMethod.Body.GetILProcessor(); registerProcessor.Append(registerProcessor.Create(OpCodes.Nop)); foreach (ushort msgId in methods.Keys) { MethodDefinition method = methods[msgId]; if (!CheckHelper.CheckMethodParams(WeaverProgram.Client, method)) { continue; } MethodDefinition protoMethodImpl = MethodFactory.CreateMethod(module, protocol, "OnProtocol_" + msgId, MethodAttributes.Private | MethodAttributes.HideBySig, true); protoMethodImpl.Parameters.Add(new ParameterDefinition("msg", ParameterAttributes.None, module.ImportReference(WeaverProgram.ChannelMessageType))); protoMethodImpl.Body.Variables.Add(new VariableDefinition(module.ImportReference(WeaverProgram.ByteBufferType))); { ILProcessor processor = protoMethodImpl.Body.GetILProcessor(); processor.Append(processor.Create(OpCodes.Nop)); processor.Append(processor.Create(OpCodes.Ldarg_1)); processor.Append(processor.Create(OpCodes.Ldfld, module.ImportReference(WeaverProgram.ChannelMessageBufferField))); processor.Append(processor.Create(OpCodes.Stloc_0)); List <int> indexs = new List <int>(); Collection <ParameterDefinition> parms = method.Parameters; for (int i = 0; i < parms.Count; ++i) { ParameterDefinition parm = parms[i]; TypeDefinition parmType = parm.ParameterType.Resolve(); protoMethodImpl.Body.Variables.Add(new VariableDefinition(module.ImportReference(parm.ParameterType))); int index = protoMethodImpl.Body.Variables.Count - 1; indexs.Add(index); if (parm.ParameterType.FullName == typeof(byte[]).FullName) { processor.Append(processor.Create(OpCodes.Ldloc_0)); processor.Append(processor.Create(OpCodes.Call, module.ImportReference(WeaverProgram.ByteUtilsReadMethod))); processor.Append(processor.Create(OpCodes.Stloc, index)); continue; } if (parm.ParameterType.FullName == typeof(ByteBuffer).FullName) { processor.Append(processor.Create(OpCodes.Ldloc_0)); processor.Append(processor.Create(OpCodes.Call, module.ImportReference(WeaverProgram.ByteBufferUtilsReadMethod))); processor.Append(processor.Create(OpCodes.Stloc, index)); continue; } if (parm.ParameterType.IsArray) { ArrayReadFactory.CreateMethodVariableReadInstruction(module, protoMethodImpl, processor, parmType); continue; } if (BaseTypeFactory.IsBaseType(parmType)) { processor.Append(processor.Create(OpCodes.Ldloc_0)); processor.Append(BaseTypeFactory.CreateReadInstruction(module, processor, parmType)); processor.Append(processor.Create(OpCodes.Stloc, index)); continue; } if (parmType.IsValueType) { MethodDefinition deserialize = StructMethodFactory.CreateDeserialize(module, parmType); processor.Append(processor.Create(OpCodes.Ldloca, index)); processor.Append(processor.Create(OpCodes.Initobj, module.ImportReference(parmType))); processor.Append(processor.Create(OpCodes.Ldloca, index)); processor.Append(processor.Create(OpCodes.Ldloc_0)); processor.Append(processor.Create(OpCodes.Call, module.ImportReference(deserialize))); } } for (int i = 0; i < indexs.Count; ++i) { processor.Append(processor.Create(OpCodes.Ldloc, indexs[i])); } processor.Append(processor.Create(OpCodes.Call, method)); processor.Append(processor.Create(OpCodes.Nop)); processor.Append(processor.Create(OpCodes.Ret)); } registerProcessor.Append(registerProcessor.Create(OpCodes.Ldarg_0)); registerProcessor.Append(registerProcessor.Create(OpCodes.Ldfld, connectionField)); registerProcessor.Append(registerProcessor.Create(OpCodes.Ldc_I4, msgId)); registerProcessor.Append(registerProcessor.Create(OpCodes.Ldarg_0)); registerProcessor.Append(registerProcessor.Create(OpCodes.Ldftn, protoMethodImpl)); registerProcessor.Append(registerProcessor.Create(OpCodes.Newobj, module.ImportReference(typeof(ChannelMessageDelegate).GetConstructor(new Type[] { typeof(object), typeof(IntPtr) })))); registerProcessor.Append(registerProcessor.Create(OpCodes.Callvirt, module.ImportReference(WeaverProgram.IConnectionRegisterHandlerMethod))); } registerProcessor.Append(registerProcessor.Create(OpCodes.Ret)); } { //public void Unregister(); MethodDefinition unregisterMethod = ResolveHelper.ResolveMethod(protocol, "UnRegister"); unregisterMethod.Body.Variables.Clear(); unregisterMethod.Body.Instructions.Clear(); ILProcessor unregisterProcessor = unregisterMethod.Body.GetILProcessor(); unregisterProcessor.Append(unregisterProcessor.Create(OpCodes.Nop)); foreach (ushort key in methods.Keys) { unregisterProcessor.Append(unregisterProcessor.Create(OpCodes.Ldarg_0)); unregisterProcessor.Append(unregisterProcessor.Create(OpCodes.Ldfld, connectionField)); unregisterProcessor.Append(unregisterProcessor.Create(OpCodes.Ldc_I4, key)); unregisterProcessor.Append(unregisterProcessor.Create(OpCodes.Callvirt, module.ImportReference(WeaverProgram.IConnectionUnregisterHandlerMethod))); } unregisterProcessor.Append(unregisterProcessor.Create(OpCodes.Ret)); } }