@@ -20,6 +20,11 @@ namespace Castle.DynamicProxy
2020 using System . Collections . Generic ;
2121 using System . Linq ;
2222 using System . Reflection ;
23+ #if NET9_0_OR_GREATER
24+ using System . IO ;
25+ using System . Reflection . Emit ;
26+ using System . Runtime . Loader ;
27+ #endif
2328
2429 using Castle . Core . Internal ;
2530 using Castle . Core . Logging ;
@@ -30,9 +35,14 @@ namespace Castle.DynamicProxy
3035 /// </summary>
3136 public class DefaultProxyBuilder : IProxyBuilder
3237 {
33- private readonly ModuleScope scope ;
38+ private ModuleScope scope ;
3439 private ILogger logger = NullLogger . Instance ;
3540
41+ #if NET9_0_OR_GREATER
42+ protected ModuleScope lastScope ;
43+ protected MemoryStream lastAssemblyGenerated ;
44+ #endif
45+
3646 /// <summary>
3747 /// Initializes a new instance of the <see cref = "DefaultProxyBuilder" /> class with new <see cref = "ModuleScope" />.
3848 /// </summary>
@@ -68,7 +78,7 @@ public Type CreateClassProxyType(Type classToProxy, Type[]? additionalInterfaces
6878 AssertValidMixins ( options , nameof ( options ) ) ;
6979
7080 var generator = new ClassProxyGenerator ( scope , classToProxy , additionalInterfacesToProxy , options ) { Logger = logger } ;
71- return generator . GetProxyType ( ) ;
81+ return ToInstantiableType ( generator . GetProxyType ( ) , generator ) ;
7282 }
7383
7484 public Type CreateClassProxyTypeWithTarget ( Type classToProxy , Type [ ] ? additionalInterfacesToProxy ,
@@ -80,7 +90,7 @@ public Type CreateClassProxyTypeWithTarget(Type classToProxy, Type[]? additional
8090
8191 var generator = new ClassProxyWithTargetGenerator ( scope , classToProxy , additionalInterfacesToProxy , options )
8292 { Logger = logger } ;
83- return generator . GetProxyType ( ) ;
93+ return ToInstantiableType ( generator . GetProxyType ( ) , generator ) ;
8494 }
8595
8696 public Type CreateInterfaceProxyTypeWithTarget ( Type interfaceToProxy , Type [ ] ? additionalInterfacesToProxy ,
@@ -92,7 +102,7 @@ public Type CreateInterfaceProxyTypeWithTarget(Type interfaceToProxy, Type[]? ad
92102 AssertValidMixins ( options , nameof ( options ) ) ;
93103
94104 var generator = new InterfaceProxyWithTargetGenerator ( scope , interfaceToProxy , additionalInterfacesToProxy , targetType , options ) { Logger = logger } ;
95- return generator . GetProxyType ( ) ;
105+ return ToInstantiableType ( generator . GetProxyType ( ) , generator ) ;
96106 }
97107
98108 public Type CreateInterfaceProxyTypeWithTargetInterface ( Type interfaceToProxy , Type [ ] ? additionalInterfacesToProxy ,
@@ -103,7 +113,7 @@ public Type CreateInterfaceProxyTypeWithTargetInterface(Type interfaceToProxy, T
103113 AssertValidMixins ( options , nameof ( options ) ) ;
104114
105115 var generator = new InterfaceProxyWithTargetInterfaceGenerator ( scope , interfaceToProxy , additionalInterfacesToProxy , interfaceToProxy , options ) { Logger = logger } ;
106- return generator . GetProxyType ( ) ;
116+ return ToInstantiableType ( generator . GetProxyType ( ) , generator ) ;
107117 }
108118
109119 public Type CreateInterfaceProxyTypeWithoutTarget ( Type interfaceToProxy , Type [ ] ? additionalInterfacesToProxy ,
@@ -114,7 +124,28 @@ public Type CreateInterfaceProxyTypeWithoutTarget(Type interfaceToProxy, Type[]?
114124 AssertValidMixins ( options , nameof ( options ) ) ;
115125
116126 var generator = new InterfaceProxyWithoutTargetGenerator ( scope , interfaceToProxy , additionalInterfacesToProxy , typeof ( object ) , options ) { Logger = logger } ;
117- return generator . GetProxyType ( ) ;
127+ return ToInstantiableType ( generator . GetProxyType ( ) , generator ) ;
128+ }
129+
130+ private Type ToInstantiableType ( Type type , BaseProxyGenerator generator )
131+ {
132+ #if NET9_0_OR_GREATER
133+ if ( type . Assembly is PersistedAssemblyBuilder persistedAssemblyBuilder )
134+ {
135+ lastAssemblyGenerated ? . Dispose ( ) ;
136+ var stream = new MemoryStream ( ) ;
137+ persistedAssemblyBuilder . Save ( stream ) ;
138+ stream . Seek ( 0 , SeekOrigin . Begin ) ;
139+ var assembly = AssemblyLoadContext . Default . LoadFromStream ( stream ) ;
140+ type = assembly . GetType ( type . FullName ! ) ! ;
141+ lastAssemblyGenerated = stream ;
142+ lastScope = scope ;
143+ scope = scope . Recycle ( ) ;
144+ }
145+
146+ generator . InitializeStaticFields ( type ) ;
147+ #endif
148+ return type ;
118149 }
119150
120151 private void AssertValidMixins ( ProxyGenerationOptions options , string paramName )
0 commit comments