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));