public static void ResolveArchitectureAssemblies(IEnumerable <string> assemblyNames) { foreach (var assemblyName in assemblyNames) { if (!resolverDescriptors.ContainsKey(assemblyName)) { var executingAssembly = FindFile(AssemblyReflector.GetBasePath(), Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().Location)); var assemblyDir = Path.GetDirectoryName(executingAssembly); var a = new AssemblyResolverDescriptor { AssemblyName = assemblyName, OriginalAssembly = Path.Combine(assemblyDir, assemblyName + ".dll"), X86Assembly = Path.Combine(assemblyDir, "x86", assemblyName + ".dll"), X64Assembly = Path.Combine(assemblyDir, "x64", assemblyName + ".dll") }; resolverDescriptors.Add(a.AssemblyName, a); if (assemblyDir != null && (File.Exists(a.OriginalAssembly))) { throw new InvalidOperationException(string.Format("Found {0}.dll which cannot exist. " + "Must instead have x86\\{0}.dll and x64\\{0}.dll. Check your build settings.", assemblyName)); } } } }
public static IEnumerable <MethodInfo> GetExtensionsMethods(this Type type, IEnumerable <Assembly> assemblies = null) { return ((assemblies ?? AssemblyReflector.GetLoadedAssemblies().Where(x => !x.IsDynamic)) .SelectMany(x => x.GetTypes()) .Where(x => x.IsClass && !x.IsGenericTypeDefinition && x.IsSealed && x.IsAbstract && x.GetConstructor(Type.EmptyTypes) == null) .SelectMany(x => x.GetMethods( BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)) .Where(x => x.GetParameters().Length > 0 && x.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false) && x.GetParameters().Length > 0) .Select(x => new { Method = x, ExtendedType = x.GetParameters().First().ParameterType }) .Where(x => x.ExtendedType.IsAssignableFrom(type) || (x.ExtendedType.IsGenericType && type.IsGenericType && x.ExtendedType.GetGenericTypeDefinition().IsAssignableFromGenericType(type.GetGenericTypeDefinition()) )) .Select(x => x.Method)); }