44using System . Collections . Generic ;
55using System . IO ;
66using System . Reflection ;
7-
7+ using NUnit . Common ;
88#if NETCOREAPP
9+ using System . Runtime . Loader ;
910using NUnit . Engine . Internal ;
1011#endif
1112
@@ -40,10 +41,12 @@ public class NUnitFrameworkApi2018 : NUnitFrameworkApi
4041 private Type ? _frameworkControllerType ;
4142
4243#if NETCOREAPP
43- private TestAssemblyLoadContext ? _assemblyLoadContext ;
44+ private AssemblyLoadContext ? _assemblyLoadContext ;
45+ private TestAssemblyResolver ? _testAssemblyResolver ;
46+ private Assembly ? _testAssembly ;
4447 private Assembly ? _frameworkAssembly ;
4548
46- internal List < ResolutionStrategy > ? ResolutionStrategies => _assemblyLoadContext ? . ResolutionStrategies ;
49+ internal List < ResolutionStrategy > ? ResolutionStrategies => _testAssemblyResolver ? . ResolutionStrategies ;
4750#endif
4851
4952 private string ? _testAssemblyPath ;
@@ -67,6 +70,10 @@ public string Load(string testAssemblyPath, IDictionary<string, object> settings
6770 _testAssemblyPath = Path . GetFullPath ( testAssemblyPath ) ;
6871 var idPrefix = _driverId + "-" ;
6972
73+ bool useDefaultAssemblyLoadContext = false ;
74+ if ( settings . TryGetValue ( SettingDefinitions . UseDefaultAssemblyLoadContext , out var val ) )
75+ useDefaultAssemblyLoadContext = ( bool ) val ;
76+
7077#if NETFRAMEWORK
7178 try
7279 {
@@ -95,12 +102,46 @@ public string Load(string testAssemblyPath, IDictionary<string, object> settings
95102 var controllerAssembly = _frameworkControllerType ? . Assembly ? . GetName ( ) ;
96103 log . Debug ( $ "Controller assembly is { controllerAssembly } ") ;
97104#else
98- _assemblyLoadContext = new TestAssemblyLoadContext ( testAssemblyPath ) ;
105+ try
106+ {
107+ _testAssembly = AssemblyHelper . FindLoadedAssemblyByPath ( _testAssemblyPath ) ;
108+
109+ if ( _testAssembly is not null )
110+ {
111+ _assemblyLoadContext = AssemblyLoadContext . GetLoadContext ( _testAssembly ) ;
112+ log . Debug ( $ " Already loaded in context { _assemblyLoadContext } ") ;
113+ }
114+ else
115+ {
116+ _assemblyLoadContext = useDefaultAssemblyLoadContext
117+ ? AssemblyLoadContext . Default
118+ : new AssemblyLoadContext ( Path . GetFileNameWithoutExtension ( testAssemblyPath ) ) ;
119+ _testAssembly = _assemblyLoadContext . LoadFromAssemblyPath ( testAssemblyPath ) ;
120+ log . Debug ( $ " Loaded into new context { _assemblyLoadContext } ") ;
121+ }
122+
123+ _testAssemblyResolver = new TestAssemblyResolver ( _assemblyLoadContext . ShouldNotBeNull ( ) , testAssemblyPath ) ;
124+ }
125+ catch ( Exception e )
126+ {
127+ var msg = $ "Failed to load test assembly { testAssemblyPath } ";
128+ log . Error ( msg ) ;
129+ throw new NUnitEngineException ( msg , e ) ;
130+ }
131+ log . Debug ( $ "Loaded { testAssemblyPath } ") ;
99132
100- var testAssembly = LoadAssembly ( testAssemblyPath ) ;
101- _frameworkAssembly = LoadAssembly ( _nunitRef ) ;
133+ try
134+ {
135+ _frameworkAssembly = LoadAssembly ( _nunitRef ) ;
136+ }
137+ catch ( Exception e )
138+ {
139+ log . Error ( $ "{ FAILED_TO_LOAD_NUNIT } \r \n { e } ") ;
140+ throw new NUnitEngineException ( FAILED_TO_LOAD_NUNIT , e ) ;
141+ }
142+ log . Debug ( "Loaded nunit.framework" ) ;
102143
103- _frameworkController = CreateInstance ( CONTROLLER_TYPE , testAssembly , idPrefix , settings ) ;
144+ _frameworkController = CreateInstance ( CONTROLLER_TYPE , _testAssembly , idPrefix , settings ) ;
104145 if ( _frameworkController is null )
105146 {
106147 log . Error ( INVALID_FRAMEWORK_MESSAGE ) ;
0 commit comments