diff --git a/src/System.Linq.Dynamic.Core/CustomTypeProviders/DefaultDynamicLinqCustomTypeProvider.cs b/src/System.Linq.Dynamic.Core/CustomTypeProviders/DefaultDynamicLinqCustomTypeProvider.cs index 3fbdfe9d..f2d35b9d 100644 --- a/src/System.Linq.Dynamic.Core/CustomTypeProviders/DefaultDynamicLinqCustomTypeProvider.cs +++ b/src/System.Linq.Dynamic.Core/CustomTypeProviders/DefaultDynamicLinqCustomTypeProvider.cs @@ -1,5 +1,6 @@ #if !(WINDOWS_APP || UAP10_0) using System.Collections.Generic; +using System.Reflection; namespace System.Linq.Dynamic.Core.CustomTypeProviders { @@ -22,21 +23,69 @@ public virtual HashSet GetCustomTypes() return _customTypes ?? (_customTypes = new HashSet(FindTypesMarkedWithAttribute())); } - private IEnumerable FindTypesMarkedWithAttribute() + protected IEnumerable FindTypesMarkedWithAttribute() { - var assemblies = _assemblyHelper.GetAssemblies(); + IEnumerable assemblies = _assemblyHelper.GetAssemblies(); #if !NET35 - assemblies = assemblies.Where(x => !x.IsDynamic).ToArray(); + assemblies = assemblies.Where(x => !x.IsDynamic); #endif + var definedTypes = ExceptionFriedlyGetAssemblyTypes(assemblies); + #if (WINDOWS_APP || DOTNET5_1 || UAP10_0 || NETSTANDARD) - var definedTypes = assemblies.SelectMany(x => x.DefinedTypes); return definedTypes.Where(x => x.CustomAttributes.Any(y => y.AttributeType == typeof(DynamicLinqTypeAttribute))).Select(x => x.AsType()); #else - var definedTypes = assemblies.SelectMany(x => x.GetTypes()); return definedTypes.Where(x => x.GetCustomAttributes(typeof(DynamicLinqTypeAttribute), false).Any()); #endif } + +#if (WINDOWS_APP || DOTNET5_1 || UAP10_0 || NETSTANDARD) + protected IEnumerable ExceptionFriedlyGetAssemblyTypes(IEnumerable assemblies) + { + foreach (var assembly in assemblies) + { + IEnumerable definedTypes = null; + + try + { + definedTypes = assembly.DefinedTypes; + } + catch (Exception) + { } + + if (definedTypes != null) + { + foreach (var definedType in definedTypes) + { + yield return definedType; + } + } + } + } +#else + protected IEnumerable ExceptionFriedlyGetAssemblyTypes(IEnumerable assemblies) + { + foreach (var assembly in assemblies) + { + IEnumerable definedTypes = null; + + try + { + definedTypes = assembly.GetTypes(); + } + catch (Exception) + { } + + if (definedTypes != null) + { + foreach (var definedType in definedTypes) + { + yield return definedType; + } + } + } + } +#endif } } #endif \ No newline at end of file