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 }