/// <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);
        }