diff --git a/src/libraries/System.Reflection.MetadataLoadContext/ref/System.Reflection.MetadataLoadContext.cs b/src/libraries/System.Reflection.MetadataLoadContext/ref/System.Reflection.MetadataLoadContext.cs index 8def4aa07a1792..777696eb825b78 100644 --- a/src/libraries/System.Reflection.MetadataLoadContext/ref/System.Reflection.MetadataLoadContext.cs +++ b/src/libraries/System.Reflection.MetadataLoadContext/ref/System.Reflection.MetadataLoadContext.cs @@ -14,7 +14,7 @@ protected MetadataAssemblyResolver() { } public sealed partial class MetadataLoadContext : System.IDisposable { public MetadataLoadContext(System.Reflection.MetadataAssemblyResolver resolver, string? coreAssemblyName = null) { } - public System.Reflection.Assembly? CoreAssembly { get { throw null; } } + public System.Reflection.Assembly CoreAssembly { get { throw null; } } public void Dispose() { } public System.Collections.Generic.IEnumerable GetAssemblies() { throw null; } public System.Reflection.Assembly LoadFromAssemblyName(System.Reflection.AssemblyName assemblyName) { throw null; } diff --git a/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/MetadataLoadContext.Apis.cs b/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/MetadataLoadContext.Apis.cs index 425be1dc7d0b34..4ec7f189e1d845 100644 --- a/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/MetadataLoadContext.Apis.cs +++ b/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/MetadataLoadContext.Apis.cs @@ -116,7 +116,8 @@ public MetadataLoadContext(MetadataAssemblyResolver resolver, string? coreAssemb } // Resolve the core assembly now - _coreTypes = new CoreTypes(this, coreAssemblyName); + _coreAssembly = LoadCoreAssembly(coreAssemblyName); + _coreTypes = new CoreTypes(_coreAssembly); } /// @@ -205,8 +206,7 @@ public Assembly LoadFromAssemblyName(AssemblyName assemblyName) /// The core assembly is treated differently than other assemblies because references to these well-known types do /// not include the assembly reference, unlike normal types. /// - /// Typically, this assembly is named "mscorlib", or "netstandard". If the core assembly cannot be found, the value will be - /// null and many other reflection methods, including those that parse method signatures, will throw. + /// Typically, this assembly is named "mscorlib", or "netstandard". /// /// The CoreAssembly is determined by passing the coreAssemblyName parameter passed to the MetadataAssemblyResolver constructor /// to the MetadataAssemblyResolver's Resolve method. @@ -240,7 +240,7 @@ public Assembly LoadFromAssemblyName(AssemblyName assemblyName) /// type, the necessary constructor or any of the parameter types of the constructor, the MetadataLoadContext will not throw. It will omit the pseudo-custom /// attribute from the list of returned attributes. /// - public Assembly? CoreAssembly + public Assembly CoreAssembly { get { diff --git a/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/MetadataLoadContext.CoreAssembly.cs b/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/MetadataLoadContext.CoreAssembly.cs index 90617b18a448ce..4f01766166704b 100644 --- a/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/MetadataLoadContext.CoreAssembly.cs +++ b/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/MetadataLoadContext.CoreAssembly.cs @@ -12,20 +12,26 @@ public sealed partial class MetadataLoadContext private static readonly string[] s_CoreNames = { "mscorlib", "System.Runtime", "netstandard" }; // Cache loaded coreAssembly and core types. - internal RoAssembly? TryGetCoreAssembly(string? coreAssemblyName, out Exception? e) + internal RoAssembly LoadCoreAssembly(string? coreAssemblyName) { Debug.Assert(_coreAssembly == null); + RoAssembly? coreAssembly; + Exception? e; if (coreAssemblyName == null) { - _coreAssembly = TryGetDefaultCoreAssembly(out e); + coreAssembly = TryGetDefaultCoreAssembly(out e); } else { RoAssemblyName roAssemblyName = new AssemblyName(coreAssemblyName).ToRoAssemblyName(); - _coreAssembly = TryResolveAssembly(roAssemblyName, out e); + coreAssembly = TryResolveAssembly(roAssemblyName, out e); } - return _coreAssembly; + if (coreAssembly == null) + { + throw e!; + } + return coreAssembly; } private RoAssembly? TryGetDefaultCoreAssembly(out Exception? e) @@ -47,7 +53,7 @@ public sealed partial class MetadataLoadContext return null; } - private RoAssembly? _coreAssembly; + private readonly RoAssembly _coreAssembly; /// /// Returns a lazily created and cached Type instance corresponding to the indicated core type. This method throws diff --git a/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/TypeLoading/General/CoreTypes.cs b/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/TypeLoading/General/CoreTypes.cs index c40fd5efb042b2..c2d90d90858ad0 100644 --- a/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/TypeLoading/General/CoreTypes.cs +++ b/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/TypeLoading/General/CoreTypes.cs @@ -11,28 +11,19 @@ internal sealed class CoreTypes private readonly RoType?[] _coreTypes; private readonly Exception?[] _exceptions; - internal CoreTypes(MetadataLoadContext loader, string? coreAssemblyName) + internal CoreTypes(RoAssembly coreAssembly) { int numCoreTypes = (int)CoreType.NumCoreTypes; RoType?[] coreTypes = new RoType[numCoreTypes]; Exception?[] exceptions = new Exception[numCoreTypes]; - RoAssembly? coreAssembly = loader.TryGetCoreAssembly(coreAssemblyName, out Exception? e); - if (coreAssembly == null) + for (int i = 0; i < numCoreTypes; i++) { - // If the core assembly was not found, don't continue. - throw e!; - } - else - { - for (int i = 0; i < numCoreTypes; i++) + ((CoreType)i).GetFullName(out ReadOnlySpan ns, out ReadOnlySpan name); + RoType? type = coreAssembly.GetTypeCore(ns, name, ignoreCase: false, out Exception? e); + coreTypes[i] = type; + if (type == null) { - ((CoreType)i).GetFullName(out ReadOnlySpan ns, out ReadOnlySpan name); - RoType? type = coreAssembly.GetTypeCore(ns, name, ignoreCase: false, out e); - coreTypes[i] = type; - if (type == null) - { - exceptions[i] = e; - } + exceptions[i] = e; } } _coreTypes = coreTypes;