bool TryLoadScannableAssembly(string assemblyPath, AssemblyScannerResults results, Dictionary <string, bool> processed, out Assembly assembly) { assembly = null; if (!IsIncluded(Path.GetFileNameWithoutExtension(assemblyPath))) { var skippedFile = new SkippedFile(assemblyPath, "File was explicitly excluded from scanning."); results.SkippedFiles.Add(skippedFile); return(false); } 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(false); } 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(false); } try { if (!ReferencesNServiceBus(assemblyPath, processed, CoreAssemblyName)) { var skippedFile = new SkippedFile(assemblyPath, "Assembly does not reference at least one of the must referenced assemblies."); results.SkippedFiles.Add(skippedFile); return(false); } var loadedAssembly = Assembly.LoadFrom(assemblyPath); if (results.Assemblies.Contains(loadedAssembly)) { return(false); } assembly = loadedAssembly; return(true); } catch (Exception ex) when(ex is BadImageFormatException || ex is FileLoadException) { results.ErrorsThrownDuringScanning = true; if (ThrowExceptions) { var errorMessage = $"Could not load '{assemblyPath}'. Consider excluding that assembly from the scanning."; throw new Exception(errorMessage, ex); } return(false); } }
bool TryLoadScannableAssembly(string assemblyPath, AssemblyScannerResults results, out Assembly assembly) { assembly = null; if (IsExcluded(Path.GetFileNameWithoutExtension(assemblyPath))) { var skippedFile = new SkippedFile(assemblyPath, "File was explicitly excluded from scanning."); results.SkippedFiles.Add(skippedFile); return(false); } assemblyValidator.ValidateAssemblyFile(assemblyPath, out var shouldLoad, out var reason); if (!shouldLoad) { var skippedFile = new SkippedFile(assemblyPath, reason); results.SkippedFiles.Add(skippedFile); return(false); } try { #if NETCOREAPP var context = AssemblyLoadContext.GetLoadContext(Assembly.GetExecutingAssembly()); assembly = context.LoadFromAssemblyPath(assemblyPath); #else assembly = Assembly.LoadFrom(assemblyPath); #endif return(true); } catch (Exception ex) when(ex is BadImageFormatException || ex is FileLoadException) { results.ErrorsThrownDuringScanning = true; if (ThrowExceptions) { var errorMessage = $"Could not load '{assemblyPath}'. Consider excluding that assembly from the scanning."; throw new Exception(errorMessage, ex); } var skippedFile = new SkippedFile(assemblyPath, ex.Message); results.SkippedFiles.Add(skippedFile); return(false); } }
bool TryLoadScannableAssembly(string assemblyPath, AssemblyScannerResults results, out Assembly assembly) { assembly = null; if (IsExcluded(Path.GetFileNameWithoutExtension(assemblyPath))) { var skippedFile = new SkippedFile(assemblyPath, "File was explicitly excluded from scanning."); results.SkippedFiles.Add(skippedFile); return(false); } assemblyValidator.ValidateAssemblyFile(assemblyPath, out var shouldLoad, out var reason); if (!shouldLoad) { var skippedFile = new SkippedFile(assemblyPath, reason); results.SkippedFiles.Add(skippedFile); return(false); } try { Console.WriteLine($"Loading {assemblyPath}"); assembly = Assembly.LoadFrom(assemblyPath); Console.WriteLine($"{assembly.FullName} loaded from location {assembly.Location}"); return(true); } catch (Exception ex) when(ex is BadImageFormatException || ex is FileLoadException) { results.ErrorsThrownDuringScanning = true; if (ThrowExceptions) { var errorMessage = $"Could not load '{assemblyPath}'. Consider excluding that assembly from the scanning."; throw new Exception(errorMessage, ex); } var skippedFile = new SkippedFile(assemblyPath, ex.Message); results.SkippedFiles.Add(skippedFile); return(false); } }
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 { //TODO: re-enable when we make message scanning lazy #1617 //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) { var errorMessage = String.Format("Could not load '{0}'. Consider excluding that assembly from the scanning.", assemblyPath); results.Errors.Add(errorMessage); return; } try { //will throw if assembly cannot be loaded assembly.GetTypes(); } catch (ReflectionTypeLoadException e) { var errorMessage = FormatReflectionTypeLoadException(assemblyPath, e); results.Errors.Add(errorMessage); return; } results.Assemblies.Add(assembly); }
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 { //TODO: re-enable when we make message scanning lazy #1617 //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); }
void ScanAssembly(string assemblyPath, AssemblyScannerResults results, Dictionary <string, bool> processed) { 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 (!ReferencesNServiceBus(assemblyPath, processed, CoreAssemblyName)) { var skippedFile = new SkippedFile(assemblyPath, "Assembly does not reference at least one of the must referenced assemblies."); results.SkippedFiles.Add(skippedFile); return; } assembly = Assembly.LoadFrom(assemblyPath); if (results.Assemblies.Contains(assembly)) { return; } } catch (Exception ex) when(ex is BadImageFormatException || ex is FileLoadException) { assembly = null; results.ErrorsThrownDuringScanning = true; if (ThrowExceptions) { var errorMessage = $"Could not load '{assemblyPath}'. Consider excluding that assembly from the scanning."; throw new Exception(errorMessage, ex); } } if (assembly == null) { return; } try { //will throw if assembly cannot be loaded results.Types.AddRange(assembly.GetTypes().Where(IsAllowedType)); } catch (ReflectionTypeLoadException e) { results.ErrorsThrownDuringScanning = true; var errorMessage = FormatReflectionTypeLoadException(assemblyPath, e); if (ThrowExceptions) { throw new Exception(errorMessage); } LogManager.GetLogger <AssemblyScanner>().Warn(errorMessage); results.Types.AddRange(e.Types.Where(IsAllowedType)); } results.Assemblies.Add(assembly); }
void ScanAssembly(string assemblyPath, AssemblyScannerResults results, Dictionary<string, bool> processed) { 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 (!ReferencesNServiceBus(assemblyPath, processed, CoreAssemblyName)) { var skippedFile = new SkippedFile(assemblyPath, "Assembly does not reference at least one of the must referenced assemblies."); results.SkippedFiles.Add(skippedFile); return; } assembly = Assembly.LoadFrom(assemblyPath); if (results.Assemblies.Contains(assembly)) { return; } } catch (Exception ex) when (ex is BadImageFormatException || ex is FileLoadException) { assembly = null; results.ErrorsThrownDuringScanning = true; if (ThrowExceptions) { var errorMessage = $"Could not load '{assemblyPath}'. Consider excluding that assembly from the scanning."; throw new Exception(errorMessage, ex); } } if (assembly == null) { return; } try { //will throw if assembly cannot be loaded results.Types.AddRange(assembly.GetTypes().Where(IsAllowedType)); } catch (ReflectionTypeLoadException e) { results.ErrorsThrownDuringScanning = true; var errorMessage = FormatReflectionTypeLoadException(assemblyPath, e); if (ThrowExceptions) { throw new Exception(errorMessage); } LogManager.GetLogger<AssemblyScanner>().Warn(errorMessage); results.Types.AddRange(e.Types.Where(IsAllowedType)); } results.Assemblies.Add(assembly); }