/// <summary> /// Creates the delegate. /// </summary> /// <param name="key">The key.</param> /// <returns></returns> private Type CreateDelegate(DynamicDelegateKey key) { var assembly = new AssemblyName { Version = new Version(0, 1, 0, 0), Name = "DynamicDelegate" + ++_createdDelegatesCount }; AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assembly, AssemblyBuilderAccess.RunAndCollect); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("DDModule", assembly.Name + ".dll", true); TypeBuilder typeBuilder = moduleBuilder.DefineType( "BooDynamicDelegate", TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.AnsiClass | TypeAttributes.AutoClass, typeof (MulticastDelegate)); ConstructorBuilder ctrBuilder = typeBuilder.DefineConstructor( MethodAttributes.RTSpecialName | MethodAttributes.HideBySig | MethodAttributes.Public, CallingConventions.Standard, new[] { typeof (object), typeof (IntPtr) }); ctrBuilder.SetImplementationFlags(MethodImplAttributes.Runtime | MethodImplAttributes.Managed); MethodBuilder methodBuilder = typeBuilder.DefineMethod( "Invoke", MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual, _method.ReturnType, _method.GetParameters().Select(p => p.ParameterType).ToArray()); methodBuilder.SetImplementationFlags(MethodImplAttributes.Runtime | MethodImplAttributes.Managed); Type delegateType = typeBuilder.CreateType(); return delegateType; }
/// <summary> /// Initializes a new instance of the <see cref="DynamicDelegate"/> class. /// </summary> /// <param name="method">The method.</param> public DynamicDelegate(MethodInfo method) { _method = method; _key = CreateSignatureKey(method); }