/// <summary> /// Scan the folder and instance all classes that dlls contain within them /// </summary> /// <param name="TargetFolder">Load in this folder for shared libraries / dlls</param> /// <param name="SharedLibraryContains">any potential plugin to load must have this in the dll name</param> /// <param name="ClassNameContains">only instance classes with this string somewhere in the same</param> public void ScanFolder(string TargetFolder, PluginFilterCheck CheckMe, string SharedLibraryContains, TargetClassLoadName CheckClassInfo, string ClassNameContains) { var Targets = GetValidExternTargets(TargetFolder, CheckMe, SharedLibraryContains); if (Targets.Count > 0) { if (CheckClassInfo == null) { foreach (string TargetSharedLib in Targets) { LoadedFileHandliers.AddRange(LoadAllPlugins(ClassNameContains, TargetSharedLib)); } } else { foreach (string TargetShareLib in Targets) { LoadedFileHandliers.AddRange(LoadAllPlugins(CheckClassInfo, TargetShareLib)); } } } }
/// <summary> /// get a list of Dlls / assemblies that match something to load /// </summary> /// <param name="TargetFolder">Check this folder</param> /// <param name="FilterCheck">if set, defines a routine that returns true if file object is ok to procede with</param> /// <param name="PluginStringContains">only valid if FilterCheck=null, FileObjects checked contain this string within their name</param> /// <returns></returns> private static List <string> GetValidExternTargets(string TargetFolder, PluginFilterCheck FilterCheck, string PluginStringContains ) { List <string> OkDlls = new List <string>(); if (string.IsNullOrEmpty(TargetFolder)) { TargetFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); } if (TargetFolder.Length > 2) { if (TargetFolder.StartsWith("\\", StringComparison.InvariantCultureIgnoreCase) == true) { if (TargetFolder.StartsWith("\\\\", StringComparison.InvariantCultureIgnoreCase) == false) { TargetFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + TargetFolder; } } } if (Directory.Exists(TargetFolder) == false) { throw new DirectoryNotFoundException(TargetFolder); } foreach (string sInfo in Directory.GetFiles(TargetFolder)) { FileInfo Info = new FileInfo(sInfo); if (FilterCheck == null) { if (string.IsNullOrEmpty(PluginStringContains)) { OkDlls.Add(sInfo); } else { if (sInfo.Contains(PluginStringContains)) { OkDlls.Add(sInfo); } } } else { if (FilterCheck(Info) == true) { OkDlls.Add(sInfo); } } } return(OkDlls); }