Example #1
0
        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");
        }
Example #2
0
        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);
        }
Example #3
0
        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));
            }
        }