示例#1
0
        private void GenerateCctor()
        {
            var allEvents = AllEvents
                            .Where(x => x.GetCustomAttribute <InvokeAttribute>() != null &&
                                   x.GetCustomAttribute <InvokeAttribute>().DispatchingStrategy == Dispatch.SerializePerType)
                            .ToList();

            if (allEvents.Count == 0)
            {
                return;
            }

            _perTypeScheduler = _typeBuilder.DefineField(
                "PerTypeScheduler",
                typeof(SerialTaskScheduler),
                FieldAttributes.Private | FieldAttributes.InitOnly | FieldAttributes.Static);

            var cctor = _typeBuilder.DefineTypeInitializer();
            var gen   = cctor.GetILGenerator();

            gen.Emit(OpCodes.Ldstr, InterfaceType.FullName);
            gen.Emit(OpCodes.Ldnull);

            var loc = gen.DeclareLocal(typeof(ulong?));

            gen.Emit(OpCodes.Ldloca, loc);
            gen.Emit(OpCodes.Initobj, typeof(ulong?));
            gen.Emit(OpCodes.Ldloc, loc);

            gen.Emit(OpCodes.Ldc_I4_0);
            gen.Emit(OpCodes.Newobj, Methods.SerialTaskSchedulerCtor);
            gen.Emit(OpCodes.Stsfld, _perTypeScheduler);
            gen.Emit(OpCodes.Ret);
        }
示例#2
0
        public Task <IEnumerable <IEntityEvent <Guid> > > GetEvents(DateTime start, DateTime end)
        {
            var events = AllEvents.Where(e => e.Timestamp >= start && e.Timestamp <= end);

            return(Task.FromResult(events));
        }
示例#3
0
        private void GenerateCtor()
        {
            var builder = _typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new[]
            {
                typeof(ulong),
                typeof(IRemotingEndPoint),
                typeof(IEndPointChannel),
                typeof(ISerializer)
            });

            var gen = builder.GetILGenerator();

            gen.Emit(OpCodes.Ldarg_0);
            gen.Emit(OpCodes.Call, Methods.ObjectCtor);

            gen.Emit(OpCodes.Ldarg_0);
            gen.Emit(OpCodes.Ldarg_1);
            gen.Emit(OpCodes.Stfld, ObjectId);

            gen.Emit(OpCodes.Ldarg_0);
            gen.Emit(OpCodes.Ldarg_2);
            gen.Emit(OpCodes.Stfld, EndPoint);

            gen.Emit(OpCodes.Ldarg_0);
            gen.Emit(OpCodes.Ldarg_3);
            gen.Emit(OpCodes.Stfld, Channel);

            gen.Emit(OpCodes.Ldarg_0);
            gen.Emit(OpCodes.Ldarg, 4);
            gen.Emit(OpCodes.Stfld, Serializer);

            var perObjectEvents = AllEvents
                                  .Where(x => x.GetCustomAttribute <InvokeAttribute>() != null &&
                                         x.GetCustomAttribute <InvokeAttribute>().DispatchingStrategy == Dispatch.SerializePerObject)
                                  .ToList();

            if (perObjectEvents.Count > 0)
            {
                _perObjectScheduler = _typeBuilder.DefineField("_perObjectScheduler",
                                                               typeof(SerialTaskScheduler),
                                                               FieldAttributes.Private | FieldAttributes.InitOnly);

                gen.Emit(OpCodes.Ldarg_0);
                gen.Emit(OpCodes.Ldstr, InterfaceType.FullName);
                gen.Emit(OpCodes.Ldnull);
                gen.Emit(OpCodes.Ldarg_1);
                gen.Emit(OpCodes.Newobj, Methods.NullableUInt64Ctor);
                gen.Emit(OpCodes.Ldc_I4_0);
                gen.Emit(OpCodes.Newobj, Methods.SerialTaskSchedulerCtor);
                gen.Emit(OpCodes.Stfld, _perObjectScheduler);
            }

            var perMethodEvents = AllEvents
                                  .Where(x => x.GetCustomAttribute <InvokeAttribute>() != null &&
                                         x.GetCustomAttribute <InvokeAttribute>().DispatchingStrategy == Dispatch.SerializePerMethod)
                                  .ToList();

            foreach (var eventInfo in perMethodEvents)
            {
                var scheduler = _typeBuilder.DefineField(string.Format("_{0}", eventInfo.Name),
                                                         typeof(SerialTaskScheduler),
                                                         FieldAttributes.Private | FieldAttributes.InitOnly);

                gen.Emit(OpCodes.Ldarg_0);
                gen.Emit(OpCodes.Ldstr, InterfaceType.FullName);
                gen.Emit(OpCodes.Ldstr, eventInfo.Name);
                gen.Emit(OpCodes.Ldarg_1);
                gen.Emit(OpCodes.Newobj, Methods.NullableUInt64Ctor);
                gen.Emit(OpCodes.Ldc_I4_0);
                gen.Emit(OpCodes.Newobj, Methods.SerialTaskSchedulerCtor);
                gen.Emit(OpCodes.Stfld, scheduler);

                _perEventSchedulers.Add(eventInfo, scheduler);
            }

            gen.Emit(OpCodes.Ret);
        }
示例#4
0
 void Init()
 {
     (m_Fields = new List <FieldInfo>(AllFields.Where(_ => Check(_)))).SortField();
     (m_Events = new List <EventInfo>(AllEvents.Where(_ => Check(_)))).SortEvent();
     (m_Propertys = new List <PropertyInfo>(AllPropertys.Where(_ => Check(_)))).SortProperty();
     m_Methods.Clear();
     foreach (var method in AllMethods)
     {
         if (!Check(method))
         {
             continue;
         }
         var valid        = true;
         var methodHandle = method.MethodHandle;
         //判断函数是不是 event add remove 函数
         foreach (var eventInfo in AllEvents)
         {
             if (eventInfo.GetAddMethod().MethodHandle == methodHandle || eventInfo.GetRemoveMethod().MethodHandle == methodHandle)
             {
                 if (!Check(eventInfo))
                 {
                     valid = false;
                 }
                 break;
             }
         }
         if (valid)
         {
             //判断函数是不是 get set 函数
             foreach (var propertyInfo in AllPropertys)
             {
                 //如果是struct 并且是 set 属性则屏蔽,强转结构体的set会报错
                 if (IsStruct && propertyInfo.GetSetMethod()?.MethodHandle == methodHandle)
                 {
                     valid = false;
                     break;
                 }
                 else if (propertyInfo.GetGetMethod()?.MethodHandle == methodHandle || propertyInfo.GetSetMethod()?.MethodHandle == methodHandle)
                 {
                     if (!Check(propertyInfo))
                     {
                         valid = false;
                     }
                     break;
                 }
             }
         }
         if (valid)
         {
             m_Methods.Add(method);
         }
     }
     m_Methods.SortMethod();
     m_ExtensionMethods.Clear();
     foreach (var extensionInfo in m_Extensions)
     {
         var nameSpace = extensionInfo.Namespace;
         var methods   = extensionInfo.GetMethods(Script.BindingFlag);
         foreach (var methodInfo in methods)
         {
             //非扩展函数
             if (!Util.IsExtensionMethod(methodInfo) || !Check(methodInfo))
             {
                 continue;
             }
             var paramterType = methodInfo.GetParameters()[0].ParameterType;
             //判断是模板函数
             if (paramterType.IsGenericParameter && paramterType.BaseType != null && paramterType.BaseType.IsAssignableFrom(m_Type))
             {
                 m_ExtensionMethods.Add(methodInfo);
             }
             else if (ScorpioReflectUtil.CheckGenericMethod(methodInfo) && paramterType.IsAssignableFrom(m_Type))
             {
                 m_ExtensionMethods.Add(methodInfo);
             }
             else
             {
                 continue;
             }
             if (!string.IsNullOrWhiteSpace(nameSpace))
             {
                 m_ExtensionUsing.Add(nameSpace);
             }
         }
     }
     m_ExtensionMethods.SortMethod();
     m_Methods.ForEach(_ => m_MethodNames.Add(_.Name));
     m_ExtensionMethods.ForEach(_ => m_MethodNames.Add(_.Name));
 }