/// <summary> /// Traverses the specified base directory including all sub-directories, generating a list of assemblies that can be /// scanned for handlers, a list of skipped files, and a list of errors that occurred while scanning. /// Scanned files may be skipped when they're either not a .NET assembly, or if a reflection-only load of the .NET /// assembly reveals that it does not reference NServiceBus. /// </summary> public AssemblyScannerResults GetScannableAssemblies() { var results = new AssemblyScannerResults(); if (IncludeAppDomainAssemblies) { var matchingAssembliesFromAppDomain = AppDomain.CurrentDomain .GetAssemblies() .Where(assembly => IsIncluded(assembly.GetName().Name)); results.Assemblies.AddRange(matchingAssembliesFromAppDomain); } foreach (var assemblyFile in ScanDirectoryForAssemblyFiles()) { ScanAssembly(assemblyFile.FullName, results); } return(results); }
void ScanAssembly(string assemblyPath, AssemblyScannerResults results) { Assembly assembly; if (!IsIncluded(Path.GetFileNameWithoutExtension(assemblyPath))) { var skippedFile = new SkippedFile(assemblyPath, "File was explicitly excluded from scanning."); results.SkippedFiles.Add(skippedFile); return; } var compilationMode = Image.GetCompilationMode(assemblyPath); if (compilationMode == Image.CompilationMode.NativeOrInvalid) { var skippedFile = new SkippedFile(assemblyPath, "File is not a .NET assembly."); results.SkippedFiles.Add(skippedFile); return; } if (!Environment.Is64BitProcess && compilationMode == Image.CompilationMode.CLRx64) { var skippedFile = new SkippedFile(assemblyPath, "x64 .NET assembly can't be loaded by a 32Bit process."); results.SkippedFiles.Add(skippedFile); return; } try { //if (!AssemblyPassesReferencesTest(assemblyPath)) //{ // var skippedFile = new SkippedFile(assemblyPath, "Assembly does not reference at least one of the must referenced assemblies."); // results.SkippedFiles.Add(skippedFile); // return; //} if (IsRuntimeAssembly(assemblyPath)) { var skippedFile = new SkippedFile(assemblyPath, "Assembly .net runtime assembly."); results.SkippedFiles.Add(skippedFile); return; } assembly = Assembly.LoadFrom(assemblyPath); if (results.Assemblies.Contains(assembly)) { return; } } catch (BadImageFormatException ex) { assembly = null; results.ErrorsThrownDuringScanning = true; if (ThrowExceptions) { var errorMessage = String.Format("Could not load '{0}'. Consider excluding that assembly from the scanning.", assemblyPath); throw new Exception(errorMessage, ex); } } if (assembly == null) { return; } try { //will throw if assembly cannot be loaded assembly.GetTypes(); } catch (ReflectionTypeLoadException e) { results.ErrorsThrownDuringScanning = true; if (ThrowExceptions) { var errorMessage = FormatReflectionTypeLoadException(assemblyPath, e); throw new Exception(errorMessage); } return; } results.Assemblies.Add(assembly); }