static TypeBuilder DefineDelegate () {
TypeBuilder typeBuilder = module.DefineType( "MyDelegate",
TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.Sealed,
typeof (object) );
args = typeBuilder.DefineGenericParameters ("TIn", "TOut");
delegate_ctor = typeBuilder.DefineConstructor(
MethodAttributes.Public | MethodAttributes.HideBySig |
MethodAttributes.RTSpecialName | MethodAttributes.SpecialName,
CallingConventions.Standard,
new Type[] { typeof(Object), typeof (IntPtr) } );
delegate_ctor.SetImplementationFlags( MethodImplAttributes.Runtime | MethodImplAttributes.Managed );
invoke_mb = typeBuilder.DefineMethod(
"Invoke",
MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.HideBySig,
args [1],
new Type[] { args [0] } );
invoke_mb.SetImplementationFlags( MethodImplAttributes.Runtime | MethodImplAttributes.Managed );
MethodBuilder mb = typeBuilder.DefineMethod(
"BeginInvoke",
MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.HideBySig,
typeof (IAsyncResult),
new Type[] { args [0], typeof (AsyncCallback), typeof (object) } );
mb.SetImplementationFlags( MethodImplAttributes.Runtime | MethodImplAttributes.Managed );
mb = typeBuilder.DefineMethod(
"EndInvoke",
MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.HideBySig,
args [1],
new Type[] { typeof (IAsyncResult) } );
mb.SetImplementationFlags( MethodImplAttributes.Runtime | MethodImplAttributes.Managed );
return typeBuilder;
}