@@ -11,21 +11,51 @@ namespace Mono.TextTemplating;
11
11
12
12
partial class CompiledTemplate
13
13
{
14
- [ SuppressMessage ( "Performance" , "CA1822:Mark members as static" , Justification = "Same API for ALC and AppDomain build variants of the class" ) ]
15
- sealed class TemplateAssemblyContext : IDisposable
14
+ /// <summary>
15
+ /// Abstracts over loading assemblies into an AssemblyLoadContext or AppDomain
16
+ /// and resolving assemblies from the host.
17
+ /// </summary>
18
+ abstract class TemplateAssemblyContext : IDisposable
16
19
{
20
+ public abstract Assembly LoadAssemblyFile ( string assemblyPath ) ;
21
+ public abstract Assembly LoadInMemoryAssembly ( CompiledAssemblyData assemblyData ) ;
22
+ public virtual void Dispose ( ) { }
23
+
24
+ [ SuppressMessage ( "Performance" , "CA1859:Use concrete types when possible for improved performance" , Justification = "Conditionally compiled version of this returns multiple concrete types" ) ]
25
+
26
+ public static TemplateAssemblyContext Create ( ITextTemplatingEngineHost host , string [ ] referenceAssemblyFiles )
27
+ {
28
+ #if FEATURE_ASSEMBLY_LOAD_CONTEXT
29
+ if ( ! host . IsAssemblyLoadContextDisabled ( ) ) {
30
+ return new AssemblyLoadContextTemplateAssemblyContext ( host , referenceAssemblyFiles ) ;
31
+ }
32
+ #endif
33
+ return new CurrentAppDomainTemplateAssemblyContext ( host , referenceAssemblyFiles ) ;
34
+ }
35
+ }
36
+
17
37
#if FEATURE_ASSEMBLY_LOAD_CONTEXT
38
+ sealed class AssemblyLoadContextTemplateAssemblyContext : TemplateAssemblyContext
39
+ {
18
40
readonly TemplateAssemblyLoadContext templateContext ;
19
- public TemplateAssemblyContext ( ITextTemplatingEngineHost host , string [ ] referenceAssemblyFiles ) => templateContext = new ( referenceAssemblyFiles , host ) ;
20
- public Assembly LoadAssemblyFile ( string assemblyPath ) => templateContext . LoadFromAssemblyPath ( assemblyPath ) ;
21
- public Assembly LoadInMemoryAssembly ( CompiledAssemblyData assemblyData ) => assemblyData . LoadInAssemblyLoadContext ( templateContext ) ;
22
- public void Dispose ( ) { }
23
- #else
24
- readonly CurrentDomainAssemblyResolver assemblyResolver ;
25
- public TemplateAssemblyContext ( ITextTemplatingEngineHost host , string [ ] referenceAssemblyFiles ) => assemblyResolver = new ( referenceAssemblyFiles , host . ResolveAssemblyReference ) ;
26
- public Assembly LoadAssemblyFile ( string assemblyPath ) => Assembly . LoadFile ( assemblyPath ) ;
27
- public Assembly LoadInMemoryAssembly ( CompiledAssemblyData assemblyData ) => assemblyData . LoadInCurrentAppDomain ( ) ;
28
- public void Dispose ( ) => assemblyResolver . Dispose ( ) ;
41
+ public AssemblyLoadContextTemplateAssemblyContext ( ITextTemplatingEngineHost host , string [ ] referenceAssemblyFiles )
42
+ => templateContext = new ( referenceAssemblyFiles , host ) ;
43
+ public override Assembly LoadAssemblyFile ( string assemblyPath ) => templateContext . LoadFromAssemblyPath ( assemblyPath ) ;
44
+ public override Assembly LoadInMemoryAssembly ( CompiledAssemblyData assemblyData ) => assemblyData . LoadInAssemblyLoadContext ( templateContext ) ;
45
+ }
29
46
#endif
47
+
48
+ sealed class CurrentAppDomainTemplateAssemblyContext : TemplateAssemblyContext
49
+ {
50
+ readonly CurrentDomainAssemblyResolver assemblyResolver ;
51
+ public CurrentAppDomainTemplateAssemblyContext ( ITextTemplatingEngineHost host , string [ ] referenceAssemblyFiles )
52
+ => assemblyResolver = new ( referenceAssemblyFiles , host . ResolveAssemblyReference ) ;
53
+ public override Assembly LoadAssemblyFile ( string assemblyPath ) => Assembly . LoadFile ( assemblyPath ) ;
54
+ public override Assembly LoadInMemoryAssembly ( CompiledAssemblyData assemblyData ) => assemblyData . LoadInCurrentAppDomain ( ) ;
55
+ public override void Dispose ( )
56
+ {
57
+ base . Dispose ( ) ;
58
+ assemblyResolver . Dispose ( ) ;
59
+ }
30
60
}
31
61
}
0 commit comments