Exemplo n.º 1
0
        /// <summary>
        /// 定义一个动态方法。
        /// </summary>
        /// <typeparam name="TDelegate">委托类型</typeparam>
        /// <param name="callback">方法生成器回调</param>
        /// <param name="restrictedSkipVisibility">是否跳过验证</param>
        /// <returns>返回一个委托</returns>
        public static TDelegate DefineDynamicMethod <TDelegate>(Action <DynamicMethod, ILGenerator> callback, bool restrictedSkipVisibility = false) where TDelegate : Delegate
        {
            MethodHelper.GetParametersTypes(typeof(TDelegate), out var parameterTypes, out var returnType);

            var dynamicMethod = new DynamicMethod(
                $"{nameof(DynamicAssembly)}_{nameof(DynamicMethod)}_{Guid.NewGuid().ToString("N")}",
                returnType,
                parameterTypes,
                restrictedSkipVisibility
                );

            callback(dynamicMethod, dynamicMethod.GetILGenerator());

            return(MethodHelper.CreateDelegate <TDelegate>(dynamicMethod));
        }
Exemplo n.º 2
0
        public static IEnumerable <Func <Type, object> > GetAllocateMethods()
        {
            {
                if (TypeHelper.GetTypeForAllAssembly("System.RuntimeTypeHandle")?.GetMethod("Allocate", Flags) is MethodInfo methodInfo)
                {
                    MethodHelper.GetParametersTypes(methodInfo, out var parameterTypes, out var returnType);

                    if (returnType == typeof(object) && parameterTypes.Length == 1 && parameterTypes[0].IsInstanceOfType(typeof(object)))
                    {
                        yield return(MethodHelper.CreateDelegate <Func <Type, object> >(methodInfo, false));
                    }
                }
            }

            {
                if (TypeHelper.GetTypeForAllAssembly("System.StubHelpers.StubHelpers")?.GetMethod("AllocateInternal", Flags) is MethodInfo methodInfo)
                {
                    MethodHelper.GetParametersTypes(methodInfo, out var parameterTypes, out var returnType);

                    if (returnType == typeof(object) && parameterTypes.Length == 1 && parameterTypes[0].IsInstanceOfType(typeof(object)))
                    {
                        yield return(MethodHelper.CreateDelegate <Func <Type, object> >(methodInfo, false));
                    }
                }
            }

            {
                if (TypeHelper.GetTypeForAllAssembly("System.Runtime.Remoting.Activation.ActivationServices")?.GetMethod("AllocateUninitializedClassInstance", Flags) is MethodInfo methodInfo)
                {
                    MethodHelper.GetParametersTypes(methodInfo, out var parameterTypes, out var returnType);

                    if (returnType == typeof(object) && parameterTypes.Length == 1 && parameterTypes[0].IsInstanceOfType(typeof(object)))
                    {
                        yield return(MethodHelper.CreateDelegate <Func <Type, object> >(methodInfo, false));
                    }

                    if (returnType == typeof(object) && parameterTypes.Length == 1 && parameterTypes[0] == typeof(IntPtr))
                    {
                        var internalFunc = MethodHelper.CreateDelegate <Func <IntPtr, object> >(methodInfo, false);

                        yield return((type) => internalFunc(type.TypeHandle.Value));
                    }
                }
            }
        }