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