/// <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)); }
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)); } } } }