/ Framework / Core / PluginFinder.cs
PluginFinder.cs
 1  using System.Reflection;
 2  
 3  namespace Core
 4  {
 5      internal static class PluginFinder
 6      {
 7          private static Type[]? pluginTypes = null;
 8  
 9          internal static Type[] GetPluginTypes()
10          {
11              if (pluginTypes != null) return pluginTypes;
12  
13              // Reflection can be costly. Do this only once.
14              FindAndLoadPluginAssemblies();
15  
16              var assemblies = AppDomain.CurrentDomain.GetAssemblies();
17              pluginTypes = assemblies.SelectMany(a => a.GetTypes().Where(t =>
18                  typeof(IProjectPlugin).IsAssignableFrom(t) &&
19                  !t.IsAbstract)
20              ).ToArray();
21  
22              return pluginTypes;
23          }
24  
25          private static void FindAndLoadPluginAssemblies()
26          {
27              var files = Directory.GetFiles(".");
28              foreach (var file in files)
29              {
30                  var f = file.ToLowerInvariant();
31                  if (f.Contains("plugin") && f.EndsWith("dll"))
32                  {
33                      var name = Path.GetFileNameWithoutExtension(file);
34                      try
35                      {
36                          Assembly.Load(name);
37                      }
38                      catch (Exception ex)
39                      {
40                          throw new Exception($"Failed to load plugin from file '{name}'.", ex);
41                      }
42                  }
43              }
44          }
45      }
46  }