[netcore] Implement referenced assembly resolving and ALC.GetLoadContext (#15946)
commit2f2f6c104b2a0115a7fb1ab24673b587c27e4365
authorAleksey Kliger (λgeek) <alklig@microsoft.com>
Fri, 2 Aug 2019 18:06:44 +0000 (2 14:06 -0400)
committerGitHub <noreply@github.com>
Fri, 2 Aug 2019 18:06:44 +0000 (2 14:06 -0400)
tree5e3a48d133a7003df176f83c80287e13a2aeef1b
parent0b8a0e09d3385281519f496f364da7e2c454a58f
[netcore] Implement referenced assembly resolving and ALC.GetLoadContext (#15946)

* [netcore] Implement GetLoadContext

* [netcore] Implement ALC-aware referenced assembly resolution.

The process is described in
https://docs.microsoft.com/en-us/dotnet/api/system.runtime.loader.assemblyloadcontext?view=netcore-3.0#usage-in-the-runtime

We try four things until one of them returns a non-null assembly.

1. Check if the assembly is already loaded in the ALC of the requesting
assembly.
2. If the ALC is not the default ALC, invoke the Load override.
3. Try the default ALC (TPA - trusted platform assemblies) loading.
4. Invoke the Resolving event of the original ALC.

The implementation borrows some managed code from
https://github.com/dotnet/coreclr/blob/8ba2e15201361402acd0ae9710bd37d50785cdfa/src/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.CoreCLR.cs#L84-L187

It would be nice if that code was shared between the runtimes.

* [runtime] Implement mono_assembly_name_culture_is_neutral

* [netcore] Add mono_alc_invoke_resolve_using_resolve_satellite

* [netcore] Use ResolveSatelliteAssembly for satellite assembly refs

* [netcore] Some AssemblyLoadContextTest tests now pass

System.Runtime.Loader.Tests.AssemblyLoadContextTest.PublicConstructor_Default
System.Runtime.Loader.Tests.AssemblyLoadContextTest.GetAssemblyNameTest_NullParameter
System.Runtime.Loader.Tests.AssemblyLoadContextTest.LoadFromAssemblyName_AssemblyNotFound
System.Runtime.Loader.Tests.AssemblyLoadContextTest.PublicConstructor_Theory (with isCollectible: False)
System.Runtime.Loader.Tests.AssemblyLoadContextTest.GetAssemblyNameTest_ValidAssembly
System.Runtime.Loader.Tests.AssemblyLoadContextTest.GetLoadContextTest_SystemPrivateCorelibAssembly
System.Runtime.Loader.Tests.AssemblyLoadContextTest.DefaultAssemblyLoadContext_Properties
System.Runtime.Loader.Tests.AssemblyLoadContextTest.GetAssemblyNameTest_AssemblyNotFound
System.Runtime.Loader.Tests.AssemblyLoadContextTest.GetLoadContextTest_ValidTrustedPlatformAssembly
mono/metadata/assembly-internals.h
mono/metadata/assembly-load-context.c
mono/metadata/assembly.c
mono/metadata/domain.c
mono/metadata/icall-def-netcore.h
mono/metadata/loader-internals.h
netcore/CoreFX.issues.rsp
netcore/System.Private.CoreLib/src/LinkerDescriptor/System.Private.CoreLib.xml
netcore/System.Private.CoreLib/src/System.Reflection/RuntimeAssembly.cs
netcore/System.Private.CoreLib/src/System.Runtime.Loader/AssemblyLoadContext.cs