diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs index 15d49e71a0e5e2..ccd3d9aa9efc5e 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs @@ -593,12 +593,12 @@ private CultureInfo GetLocale() [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetSimpleName")] private static partial void GetSimpleName(QCallAssembly assembly, StringHandleOnStack retSimpleName); - internal string? GetSimpleName() + internal string GetSimpleName() { RuntimeAssembly runtimeAssembly = this; string? name = null; GetSimpleName(new QCallAssembly(ref runtimeAssembly), new StringHandleOnStack(ref name)); - return name; + return name!; } [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AssemblyNative_GetHashAlgorithm")] diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.CoreCLR.cs index 27debf8d2a2718..bd2a5414a719aa 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.CoreCLR.cs @@ -110,7 +110,7 @@ internal Assembly LoadFromInMemoryModule(IntPtr moduleHandle) // This method is invoked by the VM to resolve a satellite assembly reference // after trying assembly resolution via Load override without success. - private static Assembly? ResolveSatelliteAssembly(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName) + private static RuntimeAssembly? ResolveSatelliteAssembly(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName) { AssemblyLoadContext context = (AssemblyLoadContext)(GCHandle.FromIntPtr(gchManagedAssemblyLoadContext).Target)!; @@ -136,7 +136,7 @@ private static IntPtr ResolveUnmanagedDllUsingEvent(string unmanagedDllName, Ass // This method is invoked by the VM to resolve an assembly reference using the Resolving event // after trying assembly resolution via Load override and TPA load context without success. - private static Assembly? ResolveUsingResolvingEvent(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName) + private static RuntimeAssembly? ResolveUsingResolvingEvent(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName) { AssemblyLoadContext context = (AssemblyLoadContext)(GCHandle.FromIntPtr(gchManagedAssemblyLoadContext).Target)!; // Invoke the AssemblyResolve event callbacks if wired up diff --git a/src/coreclr/dlls/mscorrc/mscorrc.rc b/src/coreclr/dlls/mscorrc/mscorrc.rc index 0088949d317126..2f6d8aae5906f7 100644 --- a/src/coreclr/dlls/mscorrc/mscorrc.rc +++ b/src/coreclr/dlls/mscorrc/mscorrc.rc @@ -702,7 +702,7 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_HOST_ASSEMBLY_RESOLVER_ASSEMBLY_ALREADY_LOADED_IN_CONTEXT "Assembly with same name is already loaded" - IDS_HOST_ASSEMBLY_RESOLVER_DYNAMICALLY_EMITTED_ASSEMBLIES_UNSUPPORTED "Dynamically emitted assemblies are unsupported during host-based resolution." + IDS_HOST_ASSEMBLY_RESOLVER_DYNAMICALLY_EMITTED_ASSEMBLIES_UNSUPPORTED "Dynamically emitted assemblies are unsupported for AssemblyLoadContext resolution." END STRINGTABLE DISCARDABLE diff --git a/src/coreclr/vm/appdomain.cpp b/src/coreclr/vm/appdomain.cpp index f8436aca04d5b3..decf569b90d3a9 100644 --- a/src/coreclr/vm/appdomain.cpp +++ b/src/coreclr/vm/appdomain.cpp @@ -3965,7 +3965,7 @@ Assembly* AppDomain::RaiseTypeResolveEventThrowing(Assembly* pAssembly, LPCSTR s GCX_COOP(); struct { - OBJECTREF AssemblyRef; + ASSEMBLYREF AssemblyRef; STRINGREF str; } gc; gc.AssemblyRef = NULL; @@ -3974,7 +3974,7 @@ Assembly* AppDomain::RaiseTypeResolveEventThrowing(Assembly* pAssembly, LPCSTR s GCPROTECT_BEGIN(gc); if (pAssembly != NULL) - gc.AssemblyRef = pAssembly->GetExposedObject(); + gc.AssemblyRef = (ASSEMBLYREF)pAssembly->GetExposedObject(); MethodDescCallSite onTypeResolve(METHOD__ASSEMBLYLOADCONTEXT__ON_TYPE_RESOLVE); @@ -3984,14 +3984,16 @@ Assembly* AppDomain::RaiseTypeResolveEventThrowing(Assembly* pAssembly, LPCSTR s ObjToArgSlot(gc.AssemblyRef), ObjToArgSlot(gc.str) }; - ASSEMBLYREF ResultingAssemblyRef = (ASSEMBLYREF) onTypeResolve.Call_RetOBJECTREF(args); + gc.AssemblyRef = (ASSEMBLYREF) onTypeResolve.Call_RetOBJECTREF(args); - if (ResultingAssemblyRef != NULL) + if (gc.AssemblyRef != NULL) { - pResolvedAssembly = ResultingAssemblyRef->GetAssembly(); + _ASSERTE(CoreLibBinder::IsClass(gc.AssemblyRef->GetMethodTable(), CLASS__ASSEMBLY)); + + pResolvedAssembly = gc.AssemblyRef->GetAssembly(); if (pResultingAssemblyRef) - *pResultingAssemblyRef = ResultingAssemblyRef; + *pResultingAssemblyRef = gc.AssemblyRef; else { if (pResolvedAssembly->IsCollectible()) @@ -4023,7 +4025,7 @@ Assembly* AppDomain::RaiseResourceResolveEvent(Assembly* pAssembly, LPCSTR szNam GCX_COOP(); struct { - OBJECTREF AssemblyRef; + ASSEMBLYREF AssemblyRef; STRINGREF str; } gc; gc.AssemblyRef = NULL; @@ -4032,7 +4034,7 @@ Assembly* AppDomain::RaiseResourceResolveEvent(Assembly* pAssembly, LPCSTR szNam GCPROTECT_BEGIN(gc); if (pAssembly != NULL) - gc.AssemblyRef=pAssembly->GetExposedObject(); + gc.AssemblyRef=(ASSEMBLYREF)pAssembly->GetExposedObject(); MethodDescCallSite onResourceResolve(METHOD__ASSEMBLYLOADCONTEXT__ON_RESOURCE_RESOLVE); gc.str = StringObject::NewString(szName); @@ -4041,10 +4043,12 @@ Assembly* AppDomain::RaiseResourceResolveEvent(Assembly* pAssembly, LPCSTR szNam ObjToArgSlot(gc.AssemblyRef), ObjToArgSlot(gc.str) }; - ASSEMBLYREF ResultingAssemblyRef = (ASSEMBLYREF) onResourceResolve.Call_RetOBJECTREF(args); - if (ResultingAssemblyRef != NULL) + gc.AssemblyRef = (ASSEMBLYREF) onResourceResolve.Call_RetOBJECTREF(args); + if (gc.AssemblyRef != NULL) { - pResolvedAssembly = ResultingAssemblyRef->GetAssembly(); + _ASSERTE(CoreLibBinder::IsClass(gc.AssemblyRef->GetMethodTable(), CLASS__ASSEMBLY)); + + pResolvedAssembly = gc.AssemblyRef->GetAssembly(); if (pResolvedAssembly->IsCollectible()) { COMPlusThrow(kNotSupportedException, W("NotSupported_CollectibleAssemblyResolve")); @@ -4085,7 +4089,7 @@ AppDomain::RaiseAssemblyResolveEvent( Assembly* pAssembly = NULL; struct { - OBJECTREF AssemblyRef; + ASSEMBLYREF AssemblyRef; STRINGREF str; } gc; gc.AssemblyRef = NULL; @@ -4095,7 +4099,7 @@ AppDomain::RaiseAssemblyResolveEvent( { if (pSpec->GetParentAssembly() != NULL) { - gc.AssemblyRef=pSpec->GetParentAssembly()->GetExposedObject(); + gc.AssemblyRef=(ASSEMBLYREF)pSpec->GetParentAssembly()->GetExposedObject(); } MethodDescCallSite onAssemblyResolve(METHOD__ASSEMBLYLOADCONTEXT__ON_ASSEMBLY_RESOLVE); @@ -4106,11 +4110,13 @@ AppDomain::RaiseAssemblyResolveEvent( ObjToArgSlot(gc.str) }; - ASSEMBLYREF ResultingAssemblyRef = (ASSEMBLYREF) onAssemblyResolve.Call_RetOBJECTREF(args); + gc.AssemblyRef = (ASSEMBLYREF) onAssemblyResolve.Call_RetOBJECTREF(args); - if (ResultingAssemblyRef != NULL) + if (gc.AssemblyRef != NULL) { - pAssembly = ResultingAssemblyRef->GetAssembly(); + _ASSERTE(CoreLibBinder::IsClass(gc.AssemblyRef->GetMethodTable(), CLASS__ASSEMBLY)); + + pAssembly = gc.AssemblyRef->GetAssembly(); if (pAssembly->IsCollectible()) { COMPlusThrow(kNotSupportedException, W("NotSupported_CollectibleAssemblyResolve")); @@ -4543,6 +4549,8 @@ HRESULT RuntimeInvokeHostAssemblyResolver(INT_PTR pManagedAssemblyLoadContextToB // If we are here, assembly was successfully resolved via Load or Resolving events. _ASSERTE(_gcRefs.oRefLoadedAssembly != NULL); + _ASSERTE(CoreLibBinder::IsClass(_gcRefs.oRefLoadedAssembly->GetMethodTable(), CLASS__ASSEMBLY)); + // We were able to get the assembly loaded. Now, get its name since the host could have // performed the resolution using an assembly with different name. DomainAssembly *pDomainAssembly = _gcRefs.oRefLoadedAssembly->GetDomainAssembly(); diff --git a/src/coreclr/vm/corelib.h b/src/coreclr/vm/corelib.h index 05d846a9cb456a..9a45fad784dc44 100644 --- a/src/coreclr/vm/corelib.h +++ b/src/coreclr/vm/corelib.h @@ -867,11 +867,11 @@ DEFINE_FIELD_U(_id, AssemblyLoadContextBaseObject, _id) DEFINE_FIELD_U(_state, AssemblyLoadContextBaseObject, _state) DEFINE_FIELD_U(_isCollectible, AssemblyLoadContextBaseObject, _isCollectible) DEFINE_CLASS(ASSEMBLYLOADCONTEXT, Loader, AssemblyLoadContext) -DEFINE_METHOD(ASSEMBLYLOADCONTEXT, RESOLVE, Resolve, SM_IntPtr_AssemblyName_RetAssemblyBase) +DEFINE_METHOD(ASSEMBLYLOADCONTEXT, RESOLVE, Resolve, SM_IntPtr_AssemblyName_RetAssembly) DEFINE_METHOD(ASSEMBLYLOADCONTEXT, RESOLVEUNMANAGEDDLL, ResolveUnmanagedDll, SM_Str_IntPtr_RetIntPtr) DEFINE_METHOD(ASSEMBLYLOADCONTEXT, RESOLVEUNMANAGEDDLLUSINGEVENT, ResolveUnmanagedDllUsingEvent, SM_Str_AssemblyBase_IntPtr_RetIntPtr) -DEFINE_METHOD(ASSEMBLYLOADCONTEXT, RESOLVEUSINGEVENT, ResolveUsingResolvingEvent, SM_IntPtr_AssemblyName_RetAssemblyBase) -DEFINE_METHOD(ASSEMBLYLOADCONTEXT, RESOLVESATELLITEASSEMBLY, ResolveSatelliteAssembly, SM_IntPtr_AssemblyName_RetAssemblyBase) +DEFINE_METHOD(ASSEMBLYLOADCONTEXT, RESOLVEUSINGEVENT, ResolveUsingResolvingEvent, SM_IntPtr_AssemblyName_RetAssembly) +DEFINE_METHOD(ASSEMBLYLOADCONTEXT, RESOLVESATELLITEASSEMBLY, ResolveSatelliteAssembly, SM_IntPtr_AssemblyName_RetAssembly) DEFINE_FIELD(ASSEMBLYLOADCONTEXT, ASSEMBLY_LOAD, AssemblyLoad) DEFINE_METHOD(ASSEMBLYLOADCONTEXT, ON_ASSEMBLY_LOAD, OnAssemblyLoad, SM_Assembly_RetVoid) DEFINE_METHOD(ASSEMBLYLOADCONTEXT, ON_RESOURCE_RESOLVE, OnResourceResolve, SM_Assembly_Str_RetAssembly) diff --git a/src/coreclr/vm/metasig.h b/src/coreclr/vm/metasig.h index 8a926c6b79097c..cde765a7d213b6 100644 --- a/src/coreclr/vm/metasig.h +++ b/src/coreclr/vm/metasig.h @@ -393,8 +393,6 @@ DEFINE_METASIG(IM(IntPtr_Int_RetVoid, I i, v)) DEFINE_METASIG(IM(IntInt_RetArrByte, i i, a(b))) DEFINE_METASIG(IM(RetIntPtr, _, I)) DEFINE_METASIG(IM(RetInt, _, i)) -DEFINE_METASIG_T(IM(RetAssemblyName, _, C(ASSEMBLY_NAME))) -DEFINE_METASIG_T(IM(RetAssemblyBase, _, C(ASSEMBLYBASE))) DEFINE_METASIG_T(IM(RetModule, _, C(MODULE))) DEFINE_METASIG_T(IM(PtrNativeAssemblyNameParts, P(g(NATIVE_ASSEMBLY_NAME_PARTS)), v)) DEFINE_METASIG(SM(PtrCharPtrVoid, P(u) P(v), v)) @@ -456,8 +454,6 @@ DEFINE_METASIG(IM(Int_Int_Int_Int_RetVoid, i i i i, v)) DEFINE_METASIG_T(IM(Obj_EventArgs_RetVoid, j C(EVENT_ARGS), v)) DEFINE_METASIG_T(IM(Obj_UnhandledExceptionEventArgs_RetVoid, j C(UNHANDLED_EVENTARGS), v)) -DEFINE_METASIG_T(IM(Assembly_RetBool, C(ASSEMBLY), F)) -DEFINE_METASIG_T(IM(AssemblyBase_RetBool, C(ASSEMBLYBASE), F)) DEFINE_METASIG_T(IM(Exception_RetVoid, C(EXCEPTION), v)) DEFINE_METASIG(IM(IntPtr_RetObj, I, j)) @@ -565,7 +561,7 @@ DEFINE_METASIG_T(IM(RefGuid_OutIntPtr_RetCustomQueryInterfaceResult, r(g(GUID)) DEFINE_METASIG_T(SM(RefGuid_RefGuid_RetVoid, r(g(GUID)) r(g(GUID)) , v)) DEFINE_METASIG_T(SM(RefGuid_RetVoid, r(g(GUID)), v)) -DEFINE_METASIG_T(SM(IntPtr_AssemblyName_RetAssemblyBase, I C(ASSEMBLY_NAME), C(ASSEMBLYBASE))) +DEFINE_METASIG_T(SM(IntPtr_AssemblyName_RetAssembly, I C(ASSEMBLY_NAME), C(ASSEMBLY))) DEFINE_METASIG_T(SM(Str_AssemblyBase_IntPtr_RetIntPtr, s C(ASSEMBLYBASE) I, I)) DEFINE_METASIG_T(SM(Str_AssemblyBase_Bool_UInt_RetIntPtr, s C(ASSEMBLYBASE) F K, I)) diff --git a/src/libraries/System.Private.CoreLib/src/Resources/Strings.resx b/src/libraries/System.Private.CoreLib/src/Resources/Strings.resx index 7fbe6aa0963827..413995326c9598 100644 --- a/src/libraries/System.Private.CoreLib/src/Resources/Strings.resx +++ b/src/libraries/System.Private.CoreLib/src/Resources/Strings.resx @@ -1011,8 +1011,11 @@ Only the invariant culture is supported in globalization-invariant mode. See https://aka.ms/GlobalizationInvariantMode for more information. - - Resolved assembly's simple name should be the same as of the requested assembly. + + Resolved assembly must be a runtime Assembly object. + + + Resolved assembly's simple name must be the same as of the requested assembly. Customized cultures cannot be passed by LCID, only by name. diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.cs index 94505b3dbc4ab9..d4ab9e7a3092eb 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.cs @@ -604,7 +604,7 @@ public void Dispose() #if !NATIVEAOT // This method is invoked by the VM when using the host-provided assembly load context // implementation. - private static Assembly? Resolve(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName) + private static RuntimeAssembly? Resolve(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName) { AssemblyLoadContext context = (AssemblyLoadContext)(GCHandle.FromIntPtr(gchManagedAssemblyLoadContext).Target)!; @@ -639,56 +639,44 @@ public void Dispose() return null; } - private static Assembly ValidateAssemblyNameWithSimpleName(Assembly assembly, string? requestedSimpleName) + private static RuntimeAssembly ValidateAssemblyNameWithSimpleName(Assembly assembly, string? requestedSimpleName) { ArgumentException.ThrowIfNullOrEmpty(requestedSimpleName, "AssemblyName.Name"); - // Get the name of the loaded assembly - string? loadedSimpleName = null; - // Derived type's Load implementation is expected to use one of the LoadFrom* methods to get the assembly // which is a RuntimeAssembly instance. However, since Assembly type can be used build any other artifact (e.g. AssemblyBuilder), // we need to check for RuntimeAssembly. - RuntimeAssembly? rtLoadedAssembly = GetRuntimeAssembly(assembly); - if (rtLoadedAssembly != null) + RuntimeAssembly? runtimeAssembly = GetRuntimeAssembly(assembly); + if (runtimeAssembly == null) { - loadedSimpleName = rtLoadedAssembly.GetSimpleName(); + throw new InvalidOperationException(SR.InvalidOperation_ResolvedAssemblyMustBeRuntimeAssembly); } - // The simple names should match at the very least - if (string.IsNullOrEmpty(loadedSimpleName) || !requestedSimpleName.Equals(loadedSimpleName, StringComparison.InvariantCultureIgnoreCase)) + if (!requestedSimpleName.Equals(runtimeAssembly.GetSimpleName(), StringComparison.InvariantCultureIgnoreCase)) { - throw new InvalidOperationException(SR.Argument_CustomAssemblyLoadContextRequestedNameMismatch); + throw new InvalidOperationException(SR.InvalidOperation_ResolvedAssemblyRequestedNameMismatch); } - return assembly; + return runtimeAssembly; } - private Assembly? ResolveUsingLoad(AssemblyName assemblyName) + private RuntimeAssembly? ResolveUsingLoad(AssemblyName assemblyName) { string? simpleName = assemblyName.Name; - Assembly? assembly = Load(assemblyName); - if (assembly != null) - { - assembly = ValidateAssemblyNameWithSimpleName(assembly, simpleName); - } + Assembly? assembly = Load(assemblyName); - return assembly; + return (assembly != null) ? ValidateAssemblyNameWithSimpleName(assembly, simpleName) : null; } - private Assembly? ResolveUsingEvent(AssemblyName assemblyName) + private RuntimeAssembly? ResolveUsingEvent(AssemblyName assemblyName) { string? simpleName = assemblyName.Name; // Invoke the Resolving event callbacks if wired up Assembly? assembly = GetFirstResolvedAssemblyFromResolvingEvent(assemblyName); - if (assembly != null) - { - assembly = ValidateAssemblyNameWithSimpleName(assembly, simpleName); - } - return assembly; + return (assembly != null) ? ValidateAssemblyNameWithSimpleName(assembly, simpleName) : null; } // This method is called by the VM. @@ -755,7 +743,7 @@ internal static void InvokeAssemblyLoadEvent(Assembly assembly) Justification = "Satellite assemblies have no code in them and loading is not a problem")] [UnconditionalSuppressMessage("SingleFile", "IL3000: Avoid accessing Assembly file path when publishing as a single file", Justification = "This call is fine because native call runs before this and checks BindSatelliteResourceFromBundle")] - private Assembly? ResolveSatelliteAssembly(AssemblyName assemblyName) + private RuntimeAssembly? ResolveSatelliteAssembly(AssemblyName assemblyName) { // Called by native runtime when CultureName is not empty Debug.Assert(assemblyName.CultureName?.Length > 0); @@ -767,7 +755,7 @@ internal static void InvokeAssemblyLoadEvent(Assembly assembly) string parentAssemblyName = assemblyName.Name.Substring(0, assemblyName.Name.Length - SatelliteSuffix.Length); - Assembly parentAssembly = LoadFromAssemblyName(new AssemblyName(parentAssemblyName)); + RuntimeAssembly parentAssembly = (RuntimeAssembly)LoadFromAssemblyName(new AssemblyName(parentAssemblyName)); AssemblyLoadContext parentALC = GetLoadContext(parentAssembly)!; @@ -790,7 +778,7 @@ internal static void InvokeAssemblyLoadEvent(Assembly assembly) exists = FileSystem.FileExists(assemblyPath); } - Assembly? asm = exists ? parentALC.LoadFromAssemblyPath(assemblyPath) : null; + RuntimeAssembly? asm = exists ? (RuntimeAssembly?)parentALC.LoadFromAssemblyPath(assemblyPath) : null; #if CORECLR if (IsTracingEnabled()) { diff --git a/src/libraries/System.Runtime.Loader/tests/AssemblyLoadContextTest.cs b/src/libraries/System.Runtime.Loader/tests/AssemblyLoadContextTest.cs index 1e87730a2c573d..f5b2785d823eea 100644 --- a/src/libraries/System.Runtime.Loader/tests/AssemblyLoadContextTest.cs +++ b/src/libraries/System.Runtime.Loader/tests/AssemblyLoadContextTest.cs @@ -7,6 +7,7 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Reflection.Emit; using System.Threading.Tasks; namespace System.Runtime.Loader.Tests @@ -233,5 +234,50 @@ public static void SubclassAssemblyLoadContext_Properties() Assert.Contains(alc, AssemblyLoadContext.All); Assert.Empty(alc.Assemblies); } + + class RefEmitLoadContext : AssemblyLoadContext + { + protected override Assembly? Load(AssemblyName assemblyName) + { + return AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); + } + } + + [ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))] + [ActiveIssue("https://github.com/dotnet/runtime/issues/31804", TestRuntimes.Mono)] + public static void LoadRefEmitAssembly() + { + RefEmitLoadContext alc = new(); + alc.Resolving += (sender, assembly) => { Assert.Fail("Resolving event not expected"); return null; }; + Exception error = Assert.Throws(() => alc.LoadFromAssemblyName(new AssemblyName("MyAssembly"))); + Assert.IsType(error.InnerException); + } + + class NonRuntimeAssemblyContext : AssemblyLoadContext + { + class NonRuntimeAssembly : Assembly + { + private AssemblyName _name; + + public NonRuntimeAssembly(AssemblyName name) => _name = name; + + public override AssemblyName GetName(bool copiedName) => _name; + } + + protected override Assembly? Load(AssemblyName assemblyName) + { + return new NonRuntimeAssembly(assemblyName); + } + } + + [ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsAssemblyLoadingSupported))] + [ActiveIssue("https://github.com/dotnet/runtime/issues/31804", TestRuntimes.Mono)] + public static void LoadNonRuntimeAssembly() + { + NonRuntimeAssemblyContext alc = new(); + alc.Resolving += (sender, assembly) => { Assert.Fail("Resolving event not expected"); return null; }; + Exception error = Assert.Throws(() => alc.LoadFromAssemblyName(new AssemblyName("MyAssembly"))); + Assert.IsType(error.InnerException); + } } } diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs index 9cf828210fb87e..6537bf07a0320f 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs @@ -136,28 +136,6 @@ public override Module ManifestModule // TODO: consider a dedicated icall instead public override bool IsCollectible => AssemblyLoadContext.GetLoadContext((Assembly)this)!.IsCollectible; - internal static AssemblyName? CreateAssemblyName(string assemblyString, out RuntimeAssembly? assemblyFromResolveEvent) - { - ArgumentNullException.ThrowIfNull(assemblyString); - - if ((assemblyString.Length == 0) || - (assemblyString[0] == '\0')) - throw new ArgumentException(SR.Format_StringZeroLength); - - assemblyFromResolveEvent = null; - try - { - return new AssemblyName(assemblyString); - } - catch (Exception) - { - assemblyFromResolveEvent = (RuntimeAssembly?)AssemblyLoadContext.DoAssemblyResolve(assemblyString); - if (assemblyFromResolveEvent == null) - throw new FileLoadException(assemblyString); - return null; - } - } - [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern void GetManifestResourceNames(QCallAssembly assembly_h, ObjectHandleOnStack res); diff --git a/src/mono/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.Mono.cs index 4f87fc8d6d7f25..f02c580e2645f9 100644 --- a/src/mono/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.Mono.cs @@ -118,13 +118,8 @@ public void StartProfileOptimization(string? profile) [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern Assembly[] InternalGetLoadedAssemblies(); - internal static Assembly? DoAssemblyResolve(string name) - { - return AssemblyResolve?.Invoke(null, new ResolveEventArgs(name)); - } - // Invoked by Mono to resolve using the load method. - private static Assembly? MonoResolveUsingLoad(IntPtr gchALC, string assemblyName) + private static RuntimeAssembly? MonoResolveUsingLoad(IntPtr gchALC, string assemblyName) { return Resolve(gchALC, new AssemblyName(assemblyName)); } @@ -132,14 +127,14 @@ public void StartProfileOptimization(string? profile) // Invoked by Mono to resolve using the Resolving event after // trying the Load override and default load context without // success. - private static Assembly? MonoResolveUsingResolvingEvent(IntPtr gchALC, string assemblyName) + private static RuntimeAssembly? MonoResolveUsingResolvingEvent(IntPtr gchALC, string assemblyName) { AssemblyLoadContext context = GetAssemblyLoadContext(gchALC); return context.ResolveUsingEvent(new AssemblyName(assemblyName)); } // Invoked by Mono to resolve requests to load satellite assemblies. - private static Assembly? MonoResolveUsingResolveSatelliteAssembly(IntPtr gchALC, string assemblyName) + private static RuntimeAssembly? MonoResolveUsingResolveSatelliteAssembly(IntPtr gchALC, string assemblyName) { AssemblyLoadContext context = GetAssemblyLoadContext(gchALC); return context.ResolveSatelliteAssembly(new AssemblyName(assemblyName));