@@ -98,7 +98,7 @@ private ArchLoader LoadAssembly(string fileName, bool includeDependencies, bool
98
98
return this ;
99
99
}
100
100
101
- private void LoadModule ( string fileName , string nameSpace , bool includeDependencies , bool recursive )
101
+ private void LoadModule ( string fileName , string nameSpace , bool includeDependencies , bool recursive , FilterFunc filterFunc = null )
102
102
{
103
103
try
104
104
{
@@ -112,7 +112,7 @@ private void LoadModule(string fileName, string nameSpace, bool includeDependenc
112
112
{
113
113
if ( includeDependencies && recursive )
114
114
{
115
- AddReferencedAssembliesRecursively ( assemblyReference , processedAssemblies , resolvedModules ) ;
115
+ AddReferencedAssembliesRecursively ( assemblyReference , processedAssemblies , resolvedModules , filterFunc ) ;
116
116
}
117
117
else
118
118
{
@@ -148,7 +148,8 @@ private void LoadModule(string fileName, string nameSpace, bool includeDependenc
148
148
}
149
149
150
150
private void AddReferencedAssembliesRecursively ( AssemblyNameReference currentAssemblyReference ,
151
- ICollection < AssemblyNameReference > processedAssemblies , List < ModuleDefinition > resolvedModules )
151
+ ICollection < AssemblyNameReference > processedAssemblies , List < ModuleDefinition > resolvedModules ,
152
+ FilterFunc filterFunc )
152
153
{
153
154
if ( processedAssemblies . Contains ( currentAssemblyReference ) )
154
155
{
@@ -161,17 +162,39 @@ private void AddReferencedAssembliesRecursively(AssemblyNameReference currentAss
161
162
_assemblyResolver . AddLib ( currentAssemblyReference ) ;
162
163
var assemblyDefinition = _assemblyResolver . Resolve ( currentAssemblyReference ) ??
163
164
throw new AssemblyResolutionException ( currentAssemblyReference ) ;
164
- _archBuilder . AddAssembly ( assemblyDefinition , false ) ;
165
- resolvedModules . AddRange ( assemblyDefinition . Modules ) ;
165
+
166
+ var filterResult = filterFunc ? . Invoke ( assemblyDefinition ) ;
167
+ if ( filterResult ? . LoadThisAssembly != false )
168
+ {
169
+ _archBuilder . AddAssembly ( assemblyDefinition , false ) ;
170
+ resolvedModules . AddRange ( assemblyDefinition . Modules ) ;
171
+ }
172
+
166
173
foreach ( var reference in assemblyDefinition . Modules . SelectMany ( m => m . AssemblyReferences ) )
167
174
{
168
- AddReferencedAssembliesRecursively ( reference , processedAssemblies , resolvedModules ) ;
175
+ if ( filterResult ? . TraverseDependencies != false )
176
+ AddReferencedAssembliesRecursively ( reference , processedAssemblies , resolvedModules , filterFunc ) ;
169
177
}
170
178
}
171
179
catch ( AssemblyResolutionException )
172
180
{
173
181
//Failed to resolve assembly, skip it
174
182
}
175
183
}
184
+
185
+ /// <summary>
186
+ /// Loads assemblies from dependency tree with user-defined filtration logic
187
+ /// </summary>
188
+ /// <param name="assemblies">Assemblies to start traversal from</param>
189
+ /// <param name="filterFunc">Delegate to control loading and traversal logic</param>
190
+ /// <returns></returns>
191
+ public ArchLoader LoadAssembliesRecursively ( IEnumerable < Assembly > assemblies , FilterFunc filterFunc )
192
+ {
193
+ foreach ( var assembly in assemblies )
194
+ {
195
+ LoadModule ( assembly . Location , null , true , true , filterFunc ) ;
196
+ }
197
+ return this ;
198
+ }
176
199
}
177
200
}
0 commit comments