public List <PossiblyPluginFileInfo> GetAllPluginFiles() { var arAllPlugins = new List <PossiblyPluginFileInfo>(); var pluginnames = new HashSet <string>(); // Discover plugin files, skip disabled foreach (PluginFolder folder in PluginFolders) { foreach (PossiblyPluginFileInfo file in folder.GetPluginFiles()) { // Higher priority goes first, ignore subsequent duplicates (applies to plugins only) // Non-plugins are always added if ((!file.IsPlugin) || (pluginnames.Add(Path.GetFileNameWithoutExtension(file.File.FullName)))) { arAllPlugins.Add(file); } else { // Duplicate PossiblyPluginFileInfo fileNot = PossiblyPluginFileInfo.CreateNo(file.Folder, file.File, "There was another plugin with the same assembly name in the same or a higher-priority folder."); arAllPlugins.Add(fileNot); Trace.WriteLine(fileNot.ToString(), "Plugin.Loader"); } } } return(arAllPlugins); }
public IEnumerable <PossiblyPluginFileInfo> GetPluginFiles() { if (!Directory.Exists) { return new PossiblyPluginFileInfo[] {} } ; // List of folders to check var directories = new List <DirectoryInfo> { Directory }; // In non-primary folders, also check subfolders: complex plugins might not want to mix their files up with others if (!IsPrimary) { foreach (DirectoryInfo directory in Directory.GetDirectories()) { if ((directory.Attributes & FileAttributes.Hidden) == 0) { directories.Add(directory); } } } var files = new List <PossiblyPluginFileInfo>(); PossiblyPluginFileInfo pluginfileinfo; // Look for the regex-matching files foreach (DirectoryInfo directory in directories) { foreach (FileInfo file in directory.GetFiles()) { if (!_arPluginAssemblyExtensions.Contains(file.Extension.Trim('.'))) { // Note: do not report such items at all, to avoid noise Trace.WriteLine(PossiblyPluginFileInfo.CreateNo(this, file, "File extension mismatch, assembly expected."), "Plugin.Loader"); continue; } if ((file.Attributes & FileAttributes.Hidden) != 0) // Skip hidden files { pluginfileinfo = PossiblyPluginFileInfo.CreateNo(this, file, "The file is hidden."); } else if (!RegexOmeaPluginFile.IsMatch(file.Name)) // Apply file name filter { pluginfileinfo = PossiblyPluginFileInfo.CreateNo(this, file, "The file name does not include “OmeaPlugin”."); } else { pluginfileinfo = PossiblyPluginFileInfo.CreateYes(this, file); } // Note: here we do not check for IPlugin types and such, as it will cause loading the DLLs without the progress (we don't know the total count yet) // Pick files.Add(pluginfileinfo); Trace.WriteLine(pluginfileinfo.ToString(), "Plugin.Loader"); } } return(files); }