Beispiel #1
0
		/// <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;
		}
Beispiel #2
0
		/// <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);
		}