[mono] Invoke AssemblyLoad hooks from RuntimeAssemblyBuilder:.ctor () instead from...
authorZoltan Varga <vargaz@gmail.com>
Fri, 28 Apr 2023 16:22:19 +0000 (18:22 +0200)
committerGitHub <noreply@github.com>
Fri, 28 Apr 2023 16:22:19 +0000 (18:22 +0200)
The call from native code is made before the manifest module was created, causing errors if the
hook tried to access Assembly.ManifestModule.

Fixes https://github.com/dotnet/runtime/issues/84771.

src/libraries/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.cs
src/mono/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeAssemblyBuilder.Mono.cs
src/mono/mono/metadata/appdomain.c

index 53de721a0c4585b8ce8fef43a98c2fc1832be9f2..2e8fcb7d4a0df47dd0a4698e9529627856b98d30 100644 (file)
@@ -722,6 +722,11 @@ namespace System.Runtime.Loader
             return InvokeResolveEvent(AssemblyResolve, assembly, assemblyFullName);
         }
 
+        internal static void InvokeAssemblyLoadEvent(Assembly assembly)
+        {
+            AssemblyLoad?.Invoke(AppDomain.CurrentDomain, new AssemblyLoadEventArgs(assembly));
+        }
+
         [UnconditionalSuppressMessage("SingleFile", "IL3000: Avoid accessing Assembly file path when publishing as a single file",
             Justification = "The code handles the Assembly.Location equals null")]
         private static RuntimeAssembly? InvokeResolveEvent(ResolveEventHandler? eventHandler, RuntimeAssembly? assembly, string name)
index 32cbacfc6a4df42fa2b05721e1f1ff0a38b1b77e..929b9c1ec1f594a38a19b71c08ad54ddc165393b 100644 (file)
@@ -256,6 +256,8 @@ namespace System.Reflection.Emit
             // Netcore only allows one module per assembly
             manifest_module = new RuntimeModuleBuilder(this, "RefEmit_InMemoryManifestModule");
             modules = new RuntimeModuleBuilder[] { manifest_module };
+
+            AssemblyLoadContext.InvokeAssemblyLoadEvent (this);
         }
 
         public override bool ReflectionOnly
index 686ec7e0ed5935684ffcac8bf0672368ce976300..44c8cf3de8c5ba66346803300d984aed1eea7a37 100644 (file)
@@ -571,6 +571,10 @@ mono_domain_fire_assembly_load_event (MonoDomain *domain, MonoAssembly *assembly
        if (!method)
                goto exit;
 
+       if (assembly->dynamic)
+               /* Called by RuntimeAssemblyBuilder:.ctor () after the manifest module has been created */
+               goto exit;
+
        MonoReflectionAssemblyHandle assembly_handle;
        assembly_handle = mono_assembly_get_object_handle (assembly, error);
        goto_if_nok (error, exit);