[netcore] Implement AssemblyLoadContext.GetLoadedAssemblies() (mono/mono#15832)
authorRyan Lucia <rylucia@microsoft.com>
Fri, 26 Jul 2019 16:23:43 +0000 (12:23 -0400)
committerMarek Safar <marek.safar@gmail.com>
Fri, 26 Jul 2019 16:23:43 +0000 (18:23 +0200)
* [netcore] Implement AssemblyLoadContext.GetLoadedAssemblies()

* No refonly on netcore

* Ifdef out AppDomain.GetAssemblies() on netcore

* Don't init the error

* Unnecessary ifdef

Commit migrated from https://github.com/mono/mono/commit/29428550c22384cfba20a0d2ab3f420caf082b73

src/mono/mono/metadata/appdomain.c
src/mono/mono/metadata/icall-def-netcore.h
src/mono/netcore/CoreFX.issues.rsp
src/mono/netcore/System.Private.CoreLib/src/System.Runtime.Loader/AssemblyLoadContext.cs

index 106beb2..1c900a8 100644 (file)
@@ -1282,35 +1282,13 @@ leave:
        HANDLE_FUNCTION_RETURN_VAL (is_ok (error));
 }
 
-MonoArrayHandle
-ves_icall_System_AppDomain_GetAssemblies (MonoAppDomainHandle ad, MonoBoolean refonly, MonoError *error)
+static MonoArrayHandle
+get_assembly_array_from_domain (MonoDomain *domain, MonoBoolean refonly, MonoError *error)
 {
-       error_init (error);
-       MonoDomain *domain = MONO_HANDLE_GETVAL (ad, data);
-       MonoAssembly* ass;
-       GSList *tmp;
        int i;
        GPtrArray *assemblies;
 
-       /* 
-        * Make a copy of the list of assemblies because we can't hold the assemblies
-        * lock while creating objects etc.
-        */
-       assemblies = g_ptr_array_new ();
-       /* Need to skip internal assembly builders created by remoting */
-       mono_domain_assemblies_lock (domain);
-       for (tmp = domain->domain_assemblies; tmp; tmp = tmp->next) {
-               ass = (MonoAssembly *)tmp->data;
-               MonoBoolean ass_refonly = mono_asmctx_get_kind (&ass->context) == MONO_ASMCTX_REFONLY;
-               /* .NET Framework GetAssemblies() includes LoadFrom and Load(byte[]) assemblies, too */
-               /* For netcore, this should return all the assemblies in the domain - from every ALC */
-               if (refonly != ass_refonly)
-                       continue;
-               if (ass->corlib_internal)
-                       continue;
-               g_ptr_array_add (assemblies, ass);
-       }
-       mono_domain_assemblies_unlock (domain);
+       assemblies = mono_domain_get_assemblies (domain, refonly);
 
        MonoArrayHandle res = mono_array_new_handle (domain, mono_class_get_assembly_class (), assemblies->len, error);
        goto_if_nok (error, leave);
@@ -1324,6 +1302,22 @@ leave:
        return res;
 }
 
+#ifdef ENABLE_NETCORE
+MonoArrayHandle
+ves_icall_System_Runtime_Loader_AssemblyLoadContext_InternalGetLoadedAssemblies (MonoError *error)
+{
+       MonoDomain *domain = mono_domain_get ();
+       return get_assembly_array_from_domain (domain, FALSE, error);
+}
+#else
+MonoArrayHandle
+ves_icall_System_AppDomain_GetAssemblies (MonoAppDomainHandle ad, MonoBoolean refonly, MonoError *error)
+{
+       MonoDomain *domain = MONO_HANDLE_GETVAL (ad, data);
+       return get_assembly_array_from_domain (domain, refonly, error);
+}
+#endif
+
 MonoAssembly*
 mono_try_assembly_resolve (MonoDomain *domain, const char *fname_raw, MonoAssembly *requesting, gboolean refonly, MonoError *error)
 {
index 9d1a876..297d786 100644 (file)
@@ -370,7 +370,8 @@ ICALL(MARSHAL_35, "UnsafeAddrOfPinnedArrayElement", ves_icall_System_Runtime_Int
 HANDLES(MARSHAL_41, "copy_from_unmanaged_fixed", ves_icall_System_Runtime_InteropServices_Marshal_copy_from_unmanaged, void, 5, (gconstpointer, gint32, MonoArray, gint32, gpointer))
 HANDLES(MARSHAL_42, "copy_to_unmanaged_fixed", ves_icall_System_Runtime_InteropServices_Marshal_copy_to_unmanaged, void, 5, (MonoArray, gint32, gpointer, gint32, gconstpointer))
 
-ICALL_TYPE(ALC, "System.Runtime.Loader.AssemblyLoadContext", ALC_2)
+ICALL_TYPE(ALC, "System.Runtime.Loader.AssemblyLoadContext", ALC_4)
+HANDLES(ALC_4, "InternalGetLoadedAssemblies", ves_icall_System_Runtime_Loader_AssemblyLoadContext_InternalGetLoadedAssemblies, MonoArray, 0, ())
 HANDLES(ALC_2, "InternalInitializeNativeALC", ves_icall_System_Runtime_Loader_AssemblyLoadContext_InternalInitializeNativeALC, gpointer, 3, (gpointer, MonoBoolean, MonoBoolean))
 HANDLES(ALC_1, "InternalLoadFile", ves_icall_System_Runtime_Loader_AssemblyLoadContext_InternalLoadFile, MonoReflectionAssembly, 3, (gpointer, MonoString, MonoStackCrawlMark_ptr))
 HANDLES(ALC_3, "InternalLoadFromStream", ves_icall_System_Runtime_Loader_AssemblyLoadContext_InternalLoadFromStream, MonoReflectionAssembly, 5, (gpointer, gpointer, gint32, gpointer, gint32))
index 0ff63ad..d9b5547 100644 (file)
@@ -12,9 +12,6 @@
 # https://github.com/mono/mono/issues/14854
 -nomethod Microsoft.VisualBasic.Tests.ErrObjectTests.Clear
 
-# Microsoft.VisualBasic.ApplicationServices.AssemblyInfo.LoadedAssemblies not implemented
--nomethod Microsoft.VisualBasic.ApplicationServices.Tests.AssemblyInfoTests.LoadedAssemblies
-
 ####################################################################
 ##  System.CodeDom.Tests
 ####################################################################
index 9058559..539e4e4 100644 (file)
@@ -55,7 +55,7 @@ namespace System.Runtime.Loader
 
                public static Assembly[] GetLoadedAssemblies ()
                {
-                       throw new NotImplementedException ();
+                       return InternalGetLoadedAssemblies ();
                }
 
                public static AssemblyLoadContext GetLoadContext (Assembly assembly)
@@ -80,6 +80,9 @@ namespace System.Runtime.Loader
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                extern static Assembly InternalLoadFromStream (IntPtr nativeAssemblyLoadContext, IntPtr assm, int assmLength, IntPtr symbols, int symbolsLength);
 
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]
+               extern static Assembly[] InternalGetLoadedAssemblies ();
+
                internal static Assembly DoAssemblyResolve (string name)
                {
                        return AssemblyResolve (null, new ResolveEventArgs (name));