Exemple #1
0
        /// <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());
        }
Exemple #2
0
        /// <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());
        }
Exemple #3
0
        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
                }
            }
        }
Exemple #4
0
        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
                }
            }
        }