Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }