Expose AppDomain::AssemblyResolve
authorRahul Kumar <rahku@microsoft.com>
Tue, 8 Nov 2016 19:13:33 +0000 (11:13 -0800)
committerRahul Kumar <rahku@microsoft.com>
Thu, 10 Nov 2016 18:48:54 +0000 (10:48 -0800)
Commit migrated from https://github.com/dotnet/coreclr/commit/5812c03f214da72df18b41c478d4b4bb8e1bc4c1

src/coreclr/src/mscorlib/model.xml
src/coreclr/src/mscorlib/ref/mscorlib.cs
src/coreclr/src/mscorlib/src/System/Reflection/Assembly.cs
src/coreclr/src/mscorlib/src/System/Runtime/Loader/AssemblyLoadContext.cs
src/coreclr/src/vm/appdomain.cpp

index 95284d5..5fb44e8 100644 (file)
       <Member Name="SetProfileOptimizationRoot(System.String)" />
       <Member Name="StartProfileOptimization(System.String)" />
       <Member MemberType="Event" Name="AssemblyLoad" />
+      <Member MemberType="Event" Name="AssemblyResolve" />
       <Member MemberType="Event" Name="Resolving" />
       <Member MemberType="Event" Name="ResourceResolve" />
       <Member MemberType="Event" Name="TypeResolve" />
index 1b6611c..4c364ad 100644 (file)
@@ -11971,6 +11971,7 @@ namespace System.Runtime.Loader
         public event System.Func<System.Runtime.Loader.AssemblyLoadContext, System.Reflection.AssemblyName, System.Reflection.Assembly> Resolving { add { } remove { } }
         public event System.Action<System.Runtime.Loader.AssemblyLoadContext> 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; }
index 4383c43..04f7fae 100644 (file)
@@ -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);
             }
index d46d0d0..fd896a6 100644 (file)
@@ -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)
         {
         }
 
index c8049bc..47a90ca 100644 (file)
@@ -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();
             }