/// <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));
                    }
                }
            }
        }
        protected virtual void Dispose(bool ManagedAlso)
        {
            if (ManagedAlso)
            {
                foreach (InstancedPluginContainer container in LoadedFileHandliers)
                {
                    container.Dispose();
                }
                LoadedFileHandliers.Clear();
            }

            IsDisposed = true;
        }
        private void ScanPluginFolder(string TargetFolder)
        {
            List <ScanError> ScanErrors = new List <ScanError>();

            if (string.IsNullOrEmpty(TargetFolder))
            {
                ///set target folder to current assembly's running location
                TargetFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            }
            else
            {
                if (TargetFolder.Length > 2)
                {
                    if (TargetFolder.StartsWith("\\\\")) // possible UNC path. don't assume sub directory
                    {
                    }
                    else
                    {
                        if (TargetFolder.StartsWith("\\"))
                        {
                            TargetFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + TargetFolder;
                        }
                    }
                }
            }


            foreach (string Name in Directory.EnumerateFiles(TargetFolder, "*.dll", SearchOption.TopDirectoryOnly))
            {
                string   possName = Name;
                FileInfo FileData = null;
                try
                {
                    FileData = new FileInfo(possName);
                }
                catch (IOException e)
                {
                    // just save the erros until the end;
                    ScanErrors.Add(new ScanError(e, possName));
                }

                if (FileData != null)
                {
                    LoadedFileHandliers.AddRange(this.LoadFormats(null, possName, "PluginContainer"));
                }
            }
        }