[test] Check that one AssemblyBuilder can refer to a TypeBuilder from another.
authorAleksey Kliger <aleksey@xamarin.com>
Wed, 26 Jul 2017 23:36:05 +0000 (19:36 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Thu, 27 Jul 2017 15:00:10 +0000 (11:00 -0400)
Regression test for https://bugzilla.xamarin.com/show_bug.cgi?id=58421

mcs/class/corlib/Test/System.Reflection.Emit/TypeBuilderTest.cs

index bd2f52bfbb7d3954fc09ec986dd4948ca5e98c3f..e4f73aea23f15dae625b30ee994b5e3d7df58d71 100644 (file)
@@ -11408,5 +11408,39 @@ namespace MonoTests.System.Reflection.Emit
 
                        assembly.Save (ASSEMBLY_NAME + ".dll");
                }
+
+               [Test]
+               public void TwoAssembliesMidFlightTest () {
+                       // Check that one AssemblyBuilder can refer to a TypeBuilder from another AssemblyBuilder.
+                       // Regression test for https://bugzilla.xamarin.com/show_bug.cgi?id=58421
+                       var name2 = "MonoTests.System.Reflection.Emit.TypeBuilderTest2";
+                       var assemblyName2 = new AssemblyName (name2);
+                       var assembly2 =
+                               Thread.GetDomain ().DefineDynamicAssembly (
+                                       assemblyName2, AssemblyBuilderAccess.RunAndSave, tempDir);
+
+                       var module2 = assembly2.DefineDynamicModule (name2, name2 + ".dll");
+
+                       var tb = module.DefineType ("Foo", TypeAttributes.Public);
+                       var tb2 = module2.DefineType ("Foo2", TypeAttributes.Public);
+
+                       var cb = tb.DefineConstructor (MethodAttributes.Public, CallingConventions.Standard,
+                                                      Type.EmptyTypes);
+
+                       var ilg = cb.GetILGenerator ();
+
+                       ilg.Emit (OpCodes.Ldtoken, tb2); // N.B. type from the other AssemblyBuilder
+                       ilg.Emit (OpCodes.Pop);
+                       ilg.Emit (OpCodes.Ret);
+
+                       var t = tb.CreateType ();
+                       tb2.CreateType ();
+
+                       var ci = t.GetConstructor (Type.EmptyTypes);
+                       var x = ci.Invoke (null);
+                       assembly.Save (ASSEMBLY_NAME + ".dll");
+                       assembly2.Save (name2 + ".dll");
+               }
+
        }
 }