assemblyresolve_event.cs \
assemblyresolve_event3.cs \
assemblyresolve_event4.cs \
+ assemblyresolve_event5.cs \
checked.cs \
char-isnumber.cs \
field-layout.cs \
bug-389886-3.exe \
constant-division.exe \
dynamic-method-resurrection.exe \
- assembly_append_ordering.exe
+ assembly_append_ordering.exe \
+ assemblyresolve_event5.exe
# Test which needs System.Web support
PROFILE_DISABLED_TESTS += \
assemblyresolve_event4.exe$(PLATFORM_AOT_SUFFIX): assemblyresolve_deps/Test.dll$(PLATFORM_AOT_SUFFIX) assemblyresolve_deps/TestBase.dll$(PLATFORM_AOT_SUFFIX)
assemblyresolve_event4.exe: assemblyresolve_deps/Test.dll assemblyresolve_deps/TestBase.dll
+EXTRA_DIST += assemblyresolve_event5_label.cs assemblyresolve_event5_helper.cs
+assemblyresolve_deps/assemblyresolve_event5_label.dll: assemblyresolve_event5_label.cs assemblyresolve_deps
+ $(MCS) -target:library -out:assemblyresolve_deps/assemblyresolve_event5_label.dll $(srcdir)/assemblyresolve_event5_label.cs
+assemblyresolve_event5_helper.dll: assemblyresolve_event5_helper.cs assemblyresolve_deps/assemblyresolve_event5_label.dll
+ $(MCS) -target:library -out:assemblyresolve_event5_helper.dll -r:assemblyresolve_deps/assemblyresolve_event5_label.dll $(srcdir)/assemblyresolve_event5_helper.cs
+assemblyresolve_event5.exe: assemblyresolve_event5_helper.dll
+
# We use 'test-support-files' to handle an ordering issue between the 'mono/' and 'runtime/' directories
bug-80307.exe: $(srcdir)/bug-80307.cs
$(MCS) -r:$(CLASS)/System.Web.dll -out:$@ $(srcdir)/bug-80307.cs
--- /dev/null
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+
+
+public class TestAssemblyResolveEvent {
+ public static int Main (String[] args) {
+ // Regression test for https://bugzilla.xamarin.com/show_bug.cgi?id=57851
+
+ // If the custom attributes of an assembly trigger a
+ // ResolveEventHandler, and that handler returns an
+ // AssemblyBuilder, don't crash.
+ var h = new MockResolver ("assemblyresolve_event5_label");
+ var aName = new AssemblyName ("assemblyresolve_event5_helper");
+ var a = AppDomain.CurrentDomain.Load (aName);
+ var t = a.GetType ("MyClass");
+ h.StartHandling ();
+ var cas = t.GetCustomAttributes (true);
+ h.StopHandling ();
+ return 0;
+ }
+}
+
+
+public class MockResolver {
+ private Assembly mock;
+ private ResolveEventHandler d;
+ private string theName;
+
+ public MockResolver (string theName) {
+ mock = CreateMock (theName);
+ d = new ResolveEventHandler (HandleResolveEvent);
+ this.theName = theName;
+ }
+
+ public void StartHandling () {
+ AppDomain.CurrentDomain.AssemblyResolve += d;
+ }
+
+ public void StopHandling () {
+ AppDomain.CurrentDomain.AssemblyResolve -= d;
+ }
+
+ public Assembly HandleResolveEvent (Object sender, ResolveEventArgs args) {
+ Console.Error.WriteLine ("handling load of {0}", args.Name);
+ if (args.Name.StartsWith (theName))
+ return mock;
+ else
+ return null;
+ }
+
+ private static Assembly CreateMock (string s) {
+ var an = new AssemblyName (s);
+ var ab = AssemblyBuilder.DefineDynamicAssembly (an, AssemblyBuilderAccess.Run);
+ var mb = ab.DefineDynamicModule (an.Name);
+
+ var tb = mb.DefineType ("Foo", TypeAttributes.Public);
+ tb.DefineDefaultConstructor (MethodAttributes.Public);
+ tb.CreateType ();
+
+ return ab;
+ }
+}