33
44namespace TypeTreeGeneratorAPI . TypeTreeGenerator
55{
6- public class MonoCecilResolver : DefaultAssemblyResolver
6+ public class MonoCecilResolver : BaseAssemblyResolver
77 {
8+ readonly Dictionary < string , AssemblyDefinition > cache ;
89 public ReaderParameters readerParameters ;
910 public MonoCecilResolver ( )
1011 {
12+ cache = new ( ) ;
1113 readerParameters = new ReaderParameters
1214 {
1315 InMemory = true ,
@@ -20,5 +22,40 @@ public void Register(AssemblyDefinition assembly)
2022 {
2123 RegisterAssembly ( assembly ) ;
2224 }
25+
26+ // DefaultAssemblyResolver - fullname -> name
27+ public override AssemblyDefinition Resolve ( AssemblyNameReference name )
28+ {
29+ AssemblyDefinition ? assembly ; // Use nullable type to handle potential null values
30+ if ( cache . TryGetValue ( name . Name , out assembly ) && assembly != null ) // Ensure assembly is not null
31+ return assembly ;
32+
33+ assembly = base . Resolve ( name ) ;
34+ cache [ name . FullName ] = assembly ;
35+
36+ return assembly ;
37+ }
38+
39+ protected void RegisterAssembly ( AssemblyDefinition assembly )
40+ {
41+ if ( assembly == null )
42+ throw new ArgumentNullException ( nameof ( assembly ) ) ; // Use nameof for better readability
43+
44+ var name = assembly . Name . Name ;
45+ if ( cache . ContainsKey ( name ) )
46+ return ;
47+
48+ cache [ name ] = assembly ;
49+ }
50+
51+ protected override void Dispose ( bool disposing )
52+ {
53+ foreach ( var assembly in cache . Values )
54+ assembly . Dispose ( ) ;
55+
56+ cache . Clear ( ) ;
57+
58+ base . Dispose ( disposing ) ;
59+ }
2360 }
2461}
0 commit comments