Exemple #1
0
        private IntPtr Override(MethodBase method, IntPtr pointer)
        {
            var _type       = method.ReturnType();
            var _signature  = method.Signature();
            var _parameters = new Collection <ParameterExpression>(_signature.Select(_Type => Expression.Parameter(_Type)).ToArray());
            var _method     = new DynamicMethod(string.Empty, _type, _signature, method.DeclaringType, true);
            var _body       = _method.GetILGenerator();

            _body.Emit(_signature, false);
            _body.Emit(pointer, _type, _signature);
            _body.Emit(OpCodes.Ret);
            var _invocation = _signature.Instance == null?this.Override(method, null, _parameters, Expression.Call(_method, _parameters)) : this.Override(method, _parameters[0], _parameters.Skip(1), Expression.Call(_method, _parameters));

            if (_invocation == null)
            {
                return(pointer);
            }
            _method = new DynamicMethod(string.Empty, _type, _signature, method.DeclaringType, true);
            _body   = _method.GetILGenerator();
            _body.Emit(_signature, false);
            _body.Emit(OpCodes.Call, Expression.Lambda(_invocation, _parameters).CompileToMethod());
            _body.Emit(OpCodes.Ret);
            _method.Prepare();
            return(_method.GetFunctionPointer());
        }
Exemple #2
0
        /// <summary>
        /// 以托管代码默认约定调用动态方法。
        /// </summary>
        /// <param name="ilGen">ilGen</param>
        /// <param name="dynamicMethod">动态方法</param>
        public static ILGenerator Calli(this ILGenerator ilGen, DynamicMethod dynamicMethod)
        {
            // 保存引用。
            GCHandle.Alloc(dynamicMethod);

            return(ilGen.Calli(
                       dynamicMethod.GetFunctionPointer(),
                       dynamicMethod.ReturnType,
                       dynamicMethod.GetParameters().Map(item => item.ParameterType)));
        }
        /// <summary>
        /// 以托管代码默认约定调用动态方法。
        /// </summary>
        /// <param name="ilGen">ilGen</param>
        /// <param name="dynamicMethod">动态方法</param>
        public static ILGenerator Calli(this ILGenerator ilGen, DynamicMethod dynamicMethod)
        {
            GCHandle.Alloc(dynamicMethod);

            return(Calli(ilGen, dynamicMethod.GetFunctionPointer(), dynamicMethod.ReturnType, dynamicMethod.GetParameters().Select(item => item.ParameterType).ToArray()));
        }