From f488c903fb9371cdab297ee394b32181d0ae6eab Mon Sep 17 00:00:00 2001 From: Rahul Kumar Date: Tue, 8 Nov 2016 11:13:33 -0800 Subject: [PATCH] Expose AppDomain::AssemblyResolve Commit migrated from https://github.com/dotnet/coreclr/commit/5812c03f214da72df18b41c478d4b4bb8e1bc4c1 --- src/coreclr/src/mscorlib/model.xml | 1 + src/coreclr/src/mscorlib/ref/mscorlib.cs | 1 + src/coreclr/src/mscorlib/src/System/Reflection/Assembly.cs | 4 ++-- .../src/System/Runtime/Loader/AssemblyLoadContext.cs | 12 ++++++++++-- src/coreclr/src/vm/appdomain.cpp | 2 ++ 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/coreclr/src/mscorlib/model.xml b/src/coreclr/src/mscorlib/model.xml index 95284d5..5fb44e80 100644 --- a/src/coreclr/src/mscorlib/model.xml +++ b/src/coreclr/src/mscorlib/model.xml @@ -1054,6 +1054,7 @@ + diff --git a/src/coreclr/src/mscorlib/ref/mscorlib.cs b/src/coreclr/src/mscorlib/ref/mscorlib.cs index 1b6611c..4c364ad 100644 --- a/src/coreclr/src/mscorlib/ref/mscorlib.cs +++ b/src/coreclr/src/mscorlib/ref/mscorlib.cs @@ -11971,6 +11971,7 @@ namespace System.Runtime.Loader public event System.Func Resolving { add { } remove { } } public event System.Action Unloading { add { } remove { } } public static event AssemblyLoadEventHandler AssemblyLoad { add { } remove { } } + public static event ResolveEventHandler AssemblyResolve { add { } remove { } } public static event ResolveEventHandler TypeResolve { add { } remove { } } public static event ResolveEventHandler ResourceResolve { add { } remove { } } public static System.Reflection.AssemblyName GetAssemblyName(string assemblyPath) { throw null; } diff --git a/src/coreclr/src/mscorlib/src/System/Reflection/Assembly.cs b/src/coreclr/src/mscorlib/src/System/Reflection/Assembly.cs index 4383c43..04f7fae 100644 --- a/src/coreclr/src/mscorlib/src/System/Reflection/Assembly.cs +++ b/src/coreclr/src/mscorlib/src/System/Reflection/Assembly.cs @@ -484,7 +484,7 @@ namespace System.Reflection #if FEATURE_CORECLR if(rawAssembly == null) throw new ArgumentNullException(nameof(rawAssembly)); - AssemblyLoadContext alc = new FileLoadAssemblyLoadContext(); + AssemblyLoadContext alc = new IndividualAssemblyLoadContext(); MemoryStream assemblyStream = new MemoryStream(rawAssembly); MemoryStream symbolStream = (rawSymbolStore!=null)?new MemoryStream(rawSymbolStore):null; return alc.LoadFromStream(assemblyStream, symbolStream); @@ -595,7 +595,7 @@ namespace System.Reflection { if(s_loadfile.TryGetValue(normalizedPath, out result)) return result; - AssemblyLoadContext alc = new FileLoadAssemblyLoadContext(); + AssemblyLoadContext alc = new IndividualAssemblyLoadContext(); result = alc.LoadFromAssemblyPath(normalizedPath); s_loadfile.Add(normalizedPath, result); } diff --git a/src/coreclr/src/mscorlib/src/System/Runtime/Loader/AssemblyLoadContext.cs b/src/coreclr/src/mscorlib/src/System/Runtime/Loader/AssemblyLoadContext.cs index d46d0d0..fd896a6 100644 --- a/src/coreclr/src/mscorlib/src/System/Runtime/Loader/AssemblyLoadContext.cs +++ b/src/coreclr/src/mscorlib/src/System/Runtime/Loader/AssemblyLoadContext.cs @@ -491,6 +491,14 @@ namespace System.Runtime.Loader add { AppDomain.CurrentDomain.ResourceResolve += value; } remove { AppDomain.CurrentDomain.ResourceResolve -= value; } } + + // Occurs when resolution of assembly fails + // This event is fired after resolve events of AssemblyLoadContext fails + public static event ResolveEventHandler AssemblyResolve + { + add { AppDomain.CurrentDomain.AssemblyResolve += value; } + remove { AppDomain.CurrentDomain.AssemblyResolve -= value; } + } } [System.Security.SecuritySafeCritical] @@ -510,9 +518,9 @@ namespace System.Runtime.Loader } [System.Security.SecuritySafeCritical] - internal class FileLoadAssemblyLoadContext : AssemblyLoadContext + internal class IndividualAssemblyLoadContext : AssemblyLoadContext { - internal FileLoadAssemblyLoadContext() : base(false) + internal IndividualAssemblyLoadContext() : base(false) { } diff --git a/src/coreclr/src/vm/appdomain.cpp b/src/coreclr/src/vm/appdomain.cpp index c8049bc..47a90ca 100644 --- a/src/coreclr/src/vm/appdomain.cpp +++ b/src/coreclr/src/vm/appdomain.cpp @@ -12580,11 +12580,13 @@ AppDomain::RaiseAssemblyResolveEvent( { if (pSpec->GetParentAssembly() != NULL) { +#ifndef FEATURE_CORECLR if ( pSpec->IsIntrospectionOnly() #ifdef FEATURE_FUSION || pSpec->GetParentLoadContext() == LOADCTX_TYPE_UNKNOWN #endif ) +#endif // FEATURE_CORECLR { gc.AssemblyRef=pSpec->GetParentAssembly()->GetExposedAssemblyObject(); } -- 2.7.4