using System; using System.Reflection; using System.Reflection.Emit; class TypeResolveBug { static void Main() { AppDomain.CurrentDomain.TypeResolve += new ResolveEventHandler(CurrentDomain_TypeResolve); AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("foo"), AssemblyBuilderAccess.Run); ModuleBuilder modb = ab.DefineDynamicModule("foo.dll"); TypeBuilder tb = modb.DefineType("Foo", TypeAttributes.Public); AssemblyBuilder ab2 = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("bar"), AssemblyBuilderAccess.Run); ModuleBuilder modb2 = ab2.DefineDynamicModule("bar.dll"); TypeBuilder tb2 = modb2.DefineType("Bar", TypeAttributes.Public); ConstructorBuilder cb2 = tb2.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, Type.EmptyTypes); ILGenerator ilgen2 = cb2.GetILGenerator(); ilgen2.Emit(OpCodes.Ldarg_0); ilgen2.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes)); ilgen2.Emit(OpCodes.Ret); ConstructorBuilder cb = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, Type.EmptyTypes); ILGenerator ilgen = cb.GetILGenerator(); ilgen.Emit(OpCodes.Newobj, cb2); ilgen.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(object) })); ilgen.Emit(OpCodes.Ldarg_0); ilgen.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes)); ilgen.Emit(OpCodes.Ret); Type type = tb.CreateType(); Activator.CreateInstance(type); } static Assembly CurrentDomain_TypeResolve(object sender, ResolveEventArgs args) { Console.WriteLine("TypeResolve: " + args.Name); return null; } }