Skip to content

Commit c376b97

Browse files
Scan AppDomain assemblies, do not try loading already loaded assemblies (#767)
1 parent e284b68 commit c376b97

File tree

1 file changed

+29
-5
lines changed

1 file changed

+29
-5
lines changed

src/ServiceComposer.AspNetCore/AssemblyScanner.cs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,25 @@ public void Disable()
3333
IsEnabled = false;
3434
}
3535

36-
readonly List<Func<string, FilterResults>> assemblyFilters = new List<Func<string, FilterResults>>();
36+
readonly List<Func<string, FilterResults>> assemblyFilters = [];
3737

3838
internal IEnumerable<Assembly> Scan()
3939
{
40-
var assemblies = new List<Assembly>();
40+
var assemblies = new Dictionary<string, Assembly>();
4141

4242
bool FullPathsFilter(string fullPath)
4343
{
4444
return assemblyFilters.All(filter => filter(fullPath) == FilterResults.Include);
4545
}
4646

47+
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
48+
{
49+
if (FullPathsFilter(assembly.Location))
50+
{
51+
assemblies.TryAdd(assembly.GetName().FullName, assembly);
52+
}
53+
}
54+
4755
foreach (var patternToUse in assemblySearchPatternsToUse)
4856
{
4957
var assembliesFullPaths = Directory
@@ -55,7 +63,15 @@ bool FullPathsFilter(string fullPath)
5563
AssemblyValidator.ValidateAssemblyFile(assemblyFullPath, out var shouldLoad, out _);
5664
if (shouldLoad)
5765
{
58-
assemblies.Add(Assembly.LoadFrom(assemblyFullPath));
66+
try
67+
{
68+
var assembly = Assembly.LoadFrom(assemblyFullPath);
69+
assemblies.TryAdd(assembly.GetName().FullName, assembly);
70+
}
71+
catch (FileLoadException)
72+
{
73+
// NOP — FileLoadException happens for already loaded assemblies
74+
}
5975
}
6076
}
6177
}
@@ -72,12 +88,20 @@ bool FullPathsFilter(string fullPath)
7288
AssemblyValidator.ValidateAssemblyFile(platformAssemblyFullPath, out var shouldLoad, out _);
7389
if (shouldLoad)
7490
{
75-
assemblies.Add(Assembly.LoadFrom(platformAssemblyFullPath));
91+
try
92+
{
93+
var assembly = Assembly.LoadFrom(platformAssemblyFullPath);
94+
assemblies.TryAdd(assembly.GetName().FullName, assembly);
95+
}
96+
catch (FileLoadException)
97+
{
98+
// NOP — FileLoadException happens for already loaded assemblies
99+
}
76100
}
77101
}
78102
}
79103

80-
return assemblies.Distinct();
104+
return assemblies.Values;
81105
}
82106

83107
public void AddAssemblyFilter(Func<string, FilterResults> filter)

0 commit comments

Comments
 (0)