/// <summary> /// Gets a list of the host assembly's referenced assemblies excluding /// any Microsoft, System, or Mono prefixed assemblies or assemblies with /// official Microsoft key hashes. Essentially, we get a list of all non /// Microsoft assemblies here. /// </summary> /// <returns></returns> public static IList <Assembly> GetReferencedAssemblies() { // .NET Port Hack: We do a 2-level deep check here because if the assembly you're // hoping would be loaded hasn't been loaded yet into the app domain, // it is unavailable. So we go to the next level on each and check each referenced // assembly. #if NETSTANDARD var dependencyContext = DependencyContext.Default; var assemblyNames = dependencyContext.RuntimeLibraries .SelectMany(lib => lib.GetDefaultAssemblyNames(dependencyContext)) .Where(x => !DotNetFrameworkFilter.IsFrameworkAssembly(x)) .Distinct(); var assembliesLoaded = LoadAssemblyFromName(assemblyNames); #else var assembliesLoaded = AppDomain.CurrentDomain.GetAssemblies(); #endif assembliesLoaded = assembliesLoaded.Where(x => !DotNetFrameworkFilter.IsFrameworkAssembly(x)).ToArray(); var referencedAssemblies = assembliesLoaded .SelectMany(assembly => { return(assembly .GetReferencedAssemblies() .Where(reference => !DotNetFrameworkFilter.IsFrameworkAssembly(reference)) .Select(assemblyName => LoadAssemblyFromName(assemblyName))); }) .Where(x => x != null) .Distinct(); return(assembliesLoaded.Concat(referencedAssemblies).Distinct().ToList()); }
/// <summary> /// Gets a list of the host assembly's referenced assemblies excluding /// any Microsoft, System, or Mono prefixed assemblies or assemblies with /// official Microsoft key hashes. Essentially, we get a list of all non /// Microsoft assemblies here. /// </summary> /// <returns></returns> public static IEnumerable <Assembly> GetReferencedAssemblies() { // .NET Port Hack: We do a 2-level deep check here because if the assembly you're // hoping would be loaded hasn't been loaded yet into the app domain, // it is unavailable. So we go to the next level on each and check each referenced // assembly. var assembliesLoaded = AppDomain.CurrentDomain.GetAssemblies(); var nonFrameworkAssembliesLoaded = assembliesLoaded.Where(x => !DotNetFrameworkFilter.IsFrameworkAssembly(x)); var referencedAssemblies = nonFrameworkAssembliesLoaded .SelectMany(assembly => { return(assembly .GetReferencedAssemblies() .Where(reference => !DotNetFrameworkFilter.IsFrameworkAssembly(reference)) .Select(assemblyName => LoadAssemblyFromName(assemblyName))); }) .Where(x => x != null) .Distinct(); return(nonFrameworkAssembliesLoaded.Concat(referencedAssemblies).Distinct()); }
static SPIClassIterator() { types = new HashSet <Type>(); // .NET Port Hack: We do a 2-level deep check here because if the assembly you're // hoping would be loaded hasn't been loaded yet into the app domain, // it is unavailable. So we go to the next level on each and check each referenced // assembly. #if NETSTANDARD var dependencyContext = DependencyContext.Default; var assemblyNames = dependencyContext.RuntimeLibraries .SelectMany(lib => lib.GetDefaultAssemblyNames(dependencyContext)) .Where(x => !DotNetFrameworkFilter.IsFrameworkAssembly(x)) .Distinct(); var assembliesLoaded = LoadAssemblyFromName(assemblyNames); #else var assembliesLoaded = AppDomain.CurrentDomain.GetAssemblies(); #endif assembliesLoaded = assembliesLoaded.Where(x => !DotNetFrameworkFilter.IsFrameworkAssembly(x)).ToArray(); var referencedAssemblies = assembliesLoaded .SelectMany(assembly => { return(assembly .GetReferencedAssemblies() .Where(reference => !DotNetFrameworkFilter.IsFrameworkAssembly(reference)) .Select(assemblyName => LoadAssemblyFromName(assemblyName))); }) .Where(x => x != null) .Distinct(); var assembliesToExamine = assembliesLoaded.Concat(referencedAssemblies).Distinct().ToList(); // LUCENENET HACK: // Tests such as TestImpersonation.cs expect that the assemblies // are probed in a certain order. NamedSPILoader, lines 68 - 75 adds // the first item it sees with that name. So if you have multiple // codecs, it may not add the right one, depending on the order of // the assemblies that were examined. // This results in many test failures if Types from Lucene.Net.Codecs // are examined and added to NamedSPILoader first before // Lucene.Net.TestFramework. var testFrameworkAssembly = assembliesToExamine.FirstOrDefault(x => string.Equals(x.GetName().Name, "Lucene.Net.TestFramework", StringComparison.Ordinal)); if (testFrameworkAssembly != null) { assembliesToExamine.Remove(testFrameworkAssembly); assembliesToExamine.Insert(0, testFrameworkAssembly); } foreach (var assembly in assembliesToExamine) { try { foreach (var type in assembly.GetTypes().Where(x => x.GetTypeInfo().IsPublic)) { try { if (!IsInvokableSubclassOf <S>(type)) { continue; } // We are looking for types with a default ctor // (which is used in NamedSPILoader) or has a single parameter // of type IDictionary<string, string> (for AnalysisSPILoader) var matchingCtors = type.GetConstructors().Where(ctor => { var parameters = ctor.GetParameters(); switch (parameters.Length) { case 0: // default ctor return(false); // LUCENENET NOTE: Now that we have factored Codecs into Abstract Factories, we don't need default constructors here case 1: return(typeof(IDictionary <string, string>).IsAssignableFrom(parameters[0].ParameterType)); default: return(false); } }); if (matchingCtors.Any()) { types.Add(type); } } catch { // swallow } } } catch { // swallow } } }
static SPIClassIterator() { types = new HashSet <Type>(); // .NET Port Hack: We do a 2-level deep check here because if the assembly you're // hoping would be loaded hasn't been loaded yet into the app domain, // it is unavailable. So we go to the next level on each and check each referenced // assembly. var assembliesLoaded = AppDomain.CurrentDomain.GetAssemblies().Where(x => !DotNetFrameworkFilter.IsFrameworkAssembly(x)); var referencedAssemblies = assembliesLoaded .SelectMany(assembly => { return(assembly .GetReferencedAssemblies() .Where(reference => !DotNetFrameworkFilter.IsFrameworkAssembly(reference)) .Select(assemblyName => { try { return Assembly.Load(assemblyName); } catch { // swallow return null; } })); }) .Where(x => x != null) .Distinct(); var assembliesToExamine = assembliesLoaded.Concat(referencedAssemblies).Distinct(); foreach (var assembly in assembliesToExamine) { try { foreach (var type in assembly.GetTypes().Where(x => x.IsPublic)) { try { if (!IsInvokableSubclassOf <S>(type)) { continue; } // We are looking for types with a default ctor // (which is used in NamedSPILoader) or has a single parameter // of type IDictionary<string, string> (for AnalysisSPILoader) var matchingCtors = type.GetConstructors().Where(ctor => { var parameters = ctor.GetParameters(); switch (parameters.Length) { case 0: // default ctor return(true); case 1: return(typeof(IDictionary <string, string>).IsAssignableFrom(parameters[0].ParameterType)); default: return(false); } }); if (matchingCtors.Any()) { types.Add(type); } } catch { // swallow } } } catch { // swallow } } }