Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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<System.Reflection.Assembly> GetAssemblies() { throw null; }
public System.Reflection.Assembly LoadFromAssemblyName(System.Reflection.AssemblyName assemblyName) { throw null; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/// <summary>
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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.
/// </summary>
public Assembly? CoreAssembly
public Assembly CoreAssembly
{
get
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -47,7 +53,7 @@ public sealed partial class MetadataLoadContext
return null;
}

private RoAssembly? _coreAssembly;
private readonly RoAssembly _coreAssembly;

/// <summary>
/// Returns a lazily created and cached Type instance corresponding to the indicated core type. This method throws
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<byte> ns, out ReadOnlySpan<byte> name);
RoType? type = coreAssembly.GetTypeCore(ns, name, ignoreCase: false, out Exception? e);
coreTypes[i] = type;
if (type == null)
{
((CoreType)i).GetFullName(out ReadOnlySpan<byte> ns, out ReadOnlySpan<byte> 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;
Expand Down
Loading