33// See the LICENSE file in the project root for more information.
44
55using System ;
6+ using System . Collections . Generic ;
67using System . Linq ;
78using System . Reflection ;
89using Cake . Core . Diagnostics ;
@@ -12,6 +13,7 @@ namespace Cake.Scripting.Roslyn
1213 internal sealed class ScriptAssemblyResolver : IDisposable
1314 {
1415 private readonly ICakeLog _log ;
16+ private readonly HashSet < string > _resolvedNames = new HashSet < string > ( ) ;
1517
1618 public ScriptAssemblyResolver ( ICakeLog log )
1719 {
@@ -27,19 +29,25 @@ public void Dispose()
2729 private Assembly AssemblyResolve ( object sender , ResolveEventArgs args )
2830 {
2931 var name = new AssemblyName ( args . Name ) ;
30- _log . Verbose ( $ "Resolving assembly { args . Name } ") ;
31- var assembly = AppDomain . CurrentDomain . GetAssemblies ( )
32- . FirstOrDefault ( x => ! x . IsDynamic && x . GetName ( ) . Name == name . Name )
33- ?? Assembly . Load ( name . Name ) ;
34- if ( assembly != null )
35- {
36- _log . Verbose ( $ "Resolved by assembly { assembly . FullName } ") ;
37- }
38- else
32+
33+ // Prevent recursion from the Assembly.Load() call inside
34+ if ( _resolvedNames . Add ( name . Name ) )
3935 {
40- _log . Verbose ( $ "Assembly not resolved") ;
36+ _log . Verbose ( $ "Resolving assembly { args . Name } ") ;
37+ var assembly = AppDomain . CurrentDomain . GetAssemblies ( )
38+ . FirstOrDefault ( x => ! x . IsDynamic && x . GetName ( ) . Name == name . Name )
39+ ?? Assembly . Load ( name . Name ) ;
40+ if ( assembly != null )
41+ {
42+ _log . Verbose ( $ "Resolved by assembly { assembly . FullName } ") ;
43+ }
44+ else
45+ {
46+ _log . Verbose ( $ "Assembly not resolved") ;
47+ }
48+ return assembly ;
4149 }
42- return assembly ;
50+ return null ;
4351 }
4452 }
4553}
0 commit comments