public void ScanAddIns(IAddInManagerOptions addinManagerOptions) { var folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, addinManagerOptions.PluginsDirectory); var externalAssembliesFiles = Array.Empty <string>(); try { externalAssembliesFiles = Directory.GetFiles(folder, "*.dll", SearchOption.AllDirectories); } catch (DirectoryNotFoundException ex) { Console.WriteLine($"AddIns Folder doesn't exist. Configured Folder was '{folder}'"); Console.WriteLine("A new folder will be created."); Directory.CreateDirectory(folder); } var scannedPlugins = new List <IAddIn>(); foreach (string file in externalAssembliesFiles) { var assembly = Assembly.LoadFile(file); scannedPlugins = assembly .GetTypes() .Where(type => typeof(IAddIn).IsAssignableFrom(type) && !type.IsInterface && !type.IsAbstract) .Select(Activator.CreateInstance) .Cast <IAddIn>() .ToList(); } scannedAddIns.AddRange(scannedPlugins); //Adds External AddIns AppDomain.CurrentDomain .GetAssemblies() .ToList() .ForEach(assembly => { var localAddIns = assembly .GetTypes() .Where(type => typeof(IAddIn).IsAssignableFrom(type) && !type.IsInterface && !type.IsAbstract) .Select(Activator.CreateInstance) .Cast <IAddIn>() .ToList(); scannedAddIns.AddRange(localAddIns); //Adds Internal AddIns }); var distinctAddIns = scannedAddIns.Distinct().ToList(); //Ensure same plugin is loaded once! scannedAddIns.Clear(); scannedAddIns.AddRange(distinctAddIns); }
public static IAddInProvider LoadPlugins(IAddInManagerOptions options) { if (Instance != null) { throw new InvalidOperationException("Provider already loaded."); } var callingMethod = new StackTrace().GetFrame(1).GetMethod(); if (callingMethod.Name != "Main" || !callingMethod.IsStatic || callingMethod.ReflectedType.Name != "Program") { throw new InvalidOperationException("You must call AddInProvider.LoadPlugins() inside Program.Main()."); } Instance = new AddInProvider(); Instance.ScanAddIns(options); return(Instance); }