using System; using System.Reflection; using System.Reflection.Emit; class T { #if BROKEN private static void Dispatch () { #else public static void Dispatch () { #endif Console.WriteLine ("Dispatched"); } static void Main (string [] args) { AssemblyBuilder builder; ModuleBuilder module; AssemblyName name; TypeBuilder type; MethodBuilder method; ILGenerator ilg; Type compiledtype; name = new AssemblyName (); name.Name = "TheName"; builder = AppDomain.CurrentDomain.DefineDynamicAssembly (name, AssemblyBuilderAccess.Run, null, null, null, null, null, true); module = builder.DefineDynamicModule ("TheModule"); type = module.DefineType ("TheType"); method = type.DefineMethod ("TheMethod", MethodAttributes.Public | MethodAttributes.Static, typeof (void), new Type [] {}); ilg = method.GetILGenerator (); #if BROKEN ilg.Emit (OpCodes.Call, typeof (T).GetMethod ("Dispatch", BindingFlags.NonPublic | BindingFlags.Static, null, new Type [] {}, null)); #else ilg.Emit (OpCodes.Call, typeof (T).GetMethod ("Dispatch", BindingFlags.Public | BindingFlags.Static, null, new Type [] {}, null)); #endif ilg.Emit (OpCodes.Ret); compiledtype = type.CreateType (); compiledtype.InvokeMember ("TheMethod", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, new Type [] {}); } }