private static IList <T> MergeLists <T, TE>(IEnumerable <T> first, IEnumerable <T> second, Func <T, TE> selection) { var comparer = EqualityComparerFactory <T> .CreateComparer(x => selection(x).GetHashCode(), (x, y) => x != null && x.Equals(y)); var list = new List <T>(); if (second != null && first != null) { list.AddRange(first.Where(x => !second.Contains(x, comparer))); list.AddRange(second); } else { if (first != null) { list.AddRange(first); } if (second != null) { list.AddRange(second); } } return(list); }
/// <summary> /// Probes working directory for all available metadata providers /// </summary> /// <returns>List of UWP XAML metadata providers</returns> internal static List <WUX.Markup.IXamlMetadataProvider> DiscoverMetadataProviders() { var filteredTypes = FilteredTypes; // List of discovered UWP XAML metadata providers var metadataProviders = new List <WUX.Markup.IXamlMetadataProvider>(); // Get all assemblies loaded in app domain and placed side-by-side from all DLL and EXE var loadedAssemblies = GetAssemblies(); #if NET462 var uniqueAssemblies = new HashSet <Assembly>(loadedAssemblies, EqualityComparerFactory <Assembly> .CreateComparer( a => a.GetName().FullName.GetHashCode(), (a, b) => a.GetName().FullName.Equals(b.GetName().FullName, StringComparison.OrdinalIgnoreCase))); #else var uniqueAssemblies = new HashSet <Assembly>(loadedAssemblies, EqualityComparerFactory <Assembly> .CreateComparer( a => a.GetName().FullName.GetHashCode(StringComparison.InvariantCulture), (a, b) => a.GetName().FullName.Equals(b.GetName().FullName, StringComparison.OrdinalIgnoreCase))); #endif // Load all types loadable from the assembly, ignoring any types that could not be resolved due to an issue in the dependency chain foreach (var assembly in uniqueAssemblies) { try { LoadTypesFromAssembly(assembly, ref metadataProviders, ref filteredTypes); } catch (FileLoadException) { // These exceptions are expected } } return(metadataProviders); }
/// <summary> /// Probes working directory for all available metadata providers /// </summary> /// <returns>List of UWP XAML metadata providers</returns> internal static IEnumerable <WUX.Markup.IXamlMetadataProvider> DiscoverMetadataProviders() { // Get all assemblies loaded in app domain and placed side-by-side from all DLL and EXE var loadedAssemblies = GetAssemblies(); #if NET462 var uniqueAssemblies = new HashSet <Assembly>(loadedAssemblies, EqualityComparerFactory <Assembly> .CreateComparer( a => a.GetName().FullName.GetHashCode(), (a, b) => a.GetName().FullName.Equals(b.GetName().FullName, StringComparison.OrdinalIgnoreCase))); #else var uniqueAssemblies = new HashSet <Assembly>(loadedAssemblies, EqualityComparerFactory <Assembly> .CreateComparer( a => a.GetName().FullName.GetHashCode(StringComparison.InvariantCulture), (a, b) => a.GetName().FullName.Equals(b.GetName().FullName, StringComparison.OrdinalIgnoreCase))); #endif // Load all types loadable from the assembly, ignoring any types that could not be resolved due to an issue in the dependency chain foreach (var assembly in uniqueAssemblies) { foreach (var provider in LoadTypesFromAssembly(assembly)) { yield return(provider); if (typeof(WUX.Application).IsAssignableFrom(provider.GetType())) { System.Diagnostics.Debug.WriteLine("Xaml application has been created"); yield break; } } } }