Beispiel #1
0
                unsafe internal Entry(Type type, MethodInfo method, IntPtr pointer, Activity activity)
                {
                    method.Prepare();
                    this.Type            = type;
                    this.Method          = method;
                    this.m_Pointer       = pointer;
                    this.Activity        = activity;
                    this.m_Aspectization = new LinkedList <IAspect>();
                    this.m_Dictionary    = new Dictionary <IAspect, Activity>();
                    if (method.IsVirtual)
                    {
                        return;
                    }

                    var _type = Entry.m_Module.DefineType(string.Concat(Metadata <Delegate> .Type.Name, Guid.NewGuid().ToString("N")), TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.Sealed | TypeAttributes.Abstract);

                    switch (IntPtr.Size)
                    {
                    case 4: _type.DefineField(Metadata <Entry> .Field(_Activity => _Activity.m_Pointer).Name, Metadata <int> .Type, FieldAttributes.Static | FieldAttributes.Public); break;

                    case 8: _type.DefineField(Metadata <Entry> .Field(_Activity => _Activity.m_Pointer).Name, Metadata <long> .Type, FieldAttributes.Static | FieldAttributes.Public); break;

                    default: throw new NotSupportedException();
                    }
                    var _field     = _type.CreateType().GetFields(BindingFlags.Static | BindingFlags.Public).Single();
                    var _signature = this.Method.Signature();
                    var _method    = new DynamicMethod(method.Name, this.Method.ReturnType, _signature, this.Method.DeclaringType, true);
                    var _body      = _method.GetILGenerator();

                    for (var _index = 0; _index < _signature.Length; _index++)
                    {
                        switch (_index)
                        {
                        case 0: _body.Emit(OpCodes.Ldarg_0); break;

                        case 1: _body.Emit(OpCodes.Ldarg_1); break;

                        case 2: _body.Emit(OpCodes.Ldarg_2); break;

                        case 3: _body.Emit(OpCodes.Ldarg_3); break;

                        default: _body.Emit(OpCodes.Ldarg_S, _index); break;
                        }
                    }
                    _body.Emit(OpCodes.Ldsflda, _field);
                    _body.Emit(OpCodes.Volatile);
                    _body.Emit(OpCodes.Ldobj, _field.FieldType);
                    _body.EmitCalli(OpCodes.Calli, CallingConventions.Standard, method.ReturnType, _signature, null);
                    _body.Emit(OpCodes.Ret);
                    _method.Prepare();
                    switch (IntPtr.Size)
                    {
                    case 4:
                        *((int *)(this.m_Pointer)) = _method.Pointer().ToInt32();
                        this.m_Setup = Expression.Lambda <Action <IntPtr> >(Expression.Assign(Expression.Field(null, _field), Expression.Call(Parameter <IntPtr> .Expression, Metadata <IntPtr> .Method(_Pointer => _Pointer.ToInt32()))), Parameter <IntPtr> .Expression).Compile();
                        break;

                    case 8:
                        *((long *)(this.m_Pointer)) = _method.Pointer().ToInt64();
                        this.m_Setup = Expression.Lambda <Action <IntPtr> >(Expression.Assign(Expression.Field(null, _field), Expression.Call(Parameter <IntPtr> .Expression, Metadata <IntPtr> .Method(_Pointer => _Pointer.ToInt64()))), Parameter <IntPtr> .Expression).Compile();
                        break;

                    default: throw new NotSupportedException();
                    }
                    this.m_Setup(activity.Pointer);
                }