protected virtual void Dispose(bool disposing)
 {
     if (disposing)
     {
         while (AdapterAppDomains.Count > 0)
         {
             AppDomainManager appDomain = AdapterAppDomains.Dequeue();
             appDomain.Dispose();
             appDomain = null;
         }
         ;
     }
 }
        /// <summary>
        /// Interrogates the specified packages for any IModelTermProviders, and returns all the IModelTerms provided by any found provider.
        /// </summary>
        /// <param name="identifiers">The package identifiers to interrogate, if more than one package exits the highest version will be used.</param>
        /// <returns></returns>
        public IEnumerable <IModelTermProvider> Interrogate(IEnumerable <string> identifiers)
        {
            if (identifiers == null || !identifiers.Any())
            {
                throw new ArgumentException("The identifiers for the packages to interogate must not be null or empty.", "identifiers");
            }

            var packages = System.IO.Directory.GetFiles(PackagesFolder, "*.zip");

            if (packages == null || packages.Length == 0)
            {
                return(Enumerable.Empty <IModelTermProvider>());
            }

            List <IModelTermProvider> termProviders = new List <IModelTermProvider>();

            foreach (string identifier in identifiers)
            {
                var pgks = packages.Where(f => System.Text.RegularExpressions.Regex.IsMatch(System.IO.Path.GetFileName(f), identifier + @".\d*.\d*.\d*.\d*.zip", System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.Singleline)).ToArray();
                if (pgks == null || pgks.Length == 0)
                {
                    continue;
                }

                //determine the highest version
                var version = pgks.Select(p => Version.Parse(System.IO.Path.GetFileNameWithoutExtension(p).Substring(identifier.Length + 1)))
                              .OrderByDescending(v => v.Major)
                              .ThenByDescending(v => v.Minor)
                              .ThenByDescending(v => v.Build)
                              .ThenByDescending(v => v.Revision)
                              .FirstOrDefault();

                //interogate the package in a separate appdomain to make see if any IModelTerms need to be registered
                string filepath = System.IO.Path.Combine(PackagesFolder, string.Format("{0}.{1}.zip", identifier, version));

                AppDomainManager mgr = new AppDomainManager(AppDomainBaseFolder, filepath);
                AdapterAppDomains.Enqueue(mgr);
                var providers = mgr.Interrogate().ToArray();
                if (providers.Length > 0)
                {
                    termProviders.AddRange(providers);
                }
            }

            return(termProviders);
        }