diff --git a/tools/StaticAnalysis/BreakingChangeAnalyzer/BreakingChangeAnalyzer.cs b/tools/StaticAnalysis/BreakingChangeAnalyzer/BreakingChangeAnalyzer.cs index e7ab91233366..61b684a0fb74 100644 --- a/tools/StaticAnalysis/BreakingChangeAnalyzer/BreakingChangeAnalyzer.cs +++ b/tools/StaticAnalysis/BreakingChangeAnalyzer/BreakingChangeAnalyzer.cs @@ -100,6 +100,7 @@ public void Analyze( foreach (var baseDirectory in cmdletProbingDirs.Where(s => !s.Contains("ServiceManagement") && !ModuleFilter.IsAzureStackModule(s) && Directory.Exists(Path.GetFullPath(s)))) { + SharedAssemblyLoader.Load(baseDirectory); var probingDirectories = new List {baseDirectory}; // Add current directory for probing diff --git a/tools/StaticAnalysis/DependencyAnalyzer/DependencyAnalyzer.cs b/tools/StaticAnalysis/DependencyAnalyzer/DependencyAnalyzer.cs index d463a2696c36..7352aa5dd8c0 100644 --- a/tools/StaticAnalysis/DependencyAnalyzer/DependencyAnalyzer.cs +++ b/tools/StaticAnalysis/DependencyAnalyzer/DependencyAnalyzer.cs @@ -181,7 +181,8 @@ public class DependencyAnalyzer : IStaticAnalyzer "System.Security.AccessControl", "System.Security.Principal.Windows", "System.Data.SqlClient", - "System.Security.Cryptography.ProtectedData" + "System.Security.Cryptography.ProtectedData", + "System.Text.Json" //TODO: Compare Version along with Azure.Core }; private readonly Dictionary _assemblies = @@ -226,6 +227,7 @@ public void Analyze(IEnumerable directories, IEnumerable modules _dependencyMapLogger = Logger.CreateLogger("DependencyMap.csv"); foreach (var baseDirectory in directories) { + SharedAssemblyLoader.Load(baseDirectory); foreach (var directoryPath in Directory.EnumerateDirectories(baseDirectory)) { if (modulesToAnalyze != null && @@ -291,6 +293,9 @@ private bool AddSharedAssembly(AssemblyRecord assembly) { var stored = _sharedAssemblyReferences[assembly.AssemblyName]; if (assembly.Equals(stored) || IsFrameworkAssembly(assembly.AssemblyName) && assembly.Version.Major <= 4) return true; + //TODO: Compare Azure.Core version + if (string.Equals(assembly.AssemblyName.Name, "Azure.Core", StringComparison.InvariantCultureIgnoreCase)) + return true; _sharedConflictLogger.LogRecord(new SharedAssemblyConflict { diff --git a/tools/StaticAnalysis/HelpAnalyzer/HelpAnalyzer.cs b/tools/StaticAnalysis/HelpAnalyzer/HelpAnalyzer.cs index d564b7669035..254ea0dbba0f 100644 --- a/tools/StaticAnalysis/HelpAnalyzer/HelpAnalyzer.cs +++ b/tools/StaticAnalysis/HelpAnalyzer/HelpAnalyzer.cs @@ -96,7 +96,7 @@ public void Analyze(IEnumerable scopes, IEnumerable modulesToAna var helpLogger = Logger.CreateLogger("HelpIssues.csv"); foreach (var baseDirectory in scopes.Where(s => Directory.Exists(Path.GetFullPath(s)))) { - PreloadSharedAssemblies(baseDirectory); + SharedAssemblyLoader.Load(baseDirectory); foreach (var directory in Directory.EnumerateDirectories(Path.GetFullPath(baseDirectory))) { if (modulesToAnalyze != null && @@ -116,30 +116,6 @@ public void Analyze(IEnumerable scopes, IEnumerable modulesToAna } } - private static void PreloadSharedAssemblies(string directory) - { - var sharedAssemblyFolder = Path.Combine(directory, "Az.Accounts", "NetCoreAssemblies"); - if (Directory.Exists(sharedAssemblyFolder)) - { - foreach (var file in Directory.GetFiles(sharedAssemblyFolder)) - { - try - { - Console.WriteLine($"PreloadSharedAssemblies: Starting to load assembly {file}."); - Assembly.LoadFrom(file); - } - catch (Exception e) - { - Console.WriteLine($"PreloadSharedAssemblies: Failed to load assembly {Path.GetFileNameWithoutExtension(file)} with {e}"); - } - } - } - else - { - Console.WriteLine($"PreloadSharedAssemblies: Could not find directory {sharedAssemblyFolder}."); - } - } - private void AnalyzeMamlHelp( IEnumerable scopes, string directory, diff --git a/tools/StaticAnalysis/SharedAssemblyLoader.cs b/tools/StaticAnalysis/SharedAssemblyLoader.cs new file mode 100644 index 000000000000..675b2cfed8fb --- /dev/null +++ b/tools/StaticAnalysis/SharedAssemblyLoader.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; + +namespace StaticAnalysis +{ + internal class SharedAssemblyLoader + { + public static HashSet ProcessedFolderSet = new HashSet(); + + public static void Load(string directory) + { + directory = Path.GetFullPath(directory); + if(!ProcessedFolderSet.Contains(directory)) + { + ProcessedFolderSet.Add(directory); + PreloadSharedAssemblies(directory); + } + } + + private static void PreloadSharedAssemblies(string directory) + { + var sharedAssemblyFolder = Path.Combine(directory, "Az.Accounts", "NetCoreAssemblies"); + if (Directory.Exists(sharedAssemblyFolder)) + { + foreach (var file in Directory.GetFiles(sharedAssemblyFolder)) + { + try + { + Console.WriteLine($"PreloadSharedAssemblies: Starting to load assembly {file}."); + Assembly.LoadFrom(file); + } + catch (Exception e) + { + Console.WriteLine($"PreloadSharedAssemblies: Failed (but could be IGNORED) to load assembly {Path.GetFileNameWithoutExtension(file)} with {e}"); + } + } + } + else + { + Console.WriteLine($"PreloadSharedAssemblies: Could not find directory {sharedAssemblyFolder}."); + } + } + } +} diff --git a/tools/StaticAnalysis/SignatureVerifier/SignatureVerifier.cs b/tools/StaticAnalysis/SignatureVerifier/SignatureVerifier.cs index c3a9ff47d75c..991e8bd8aba9 100644 --- a/tools/StaticAnalysis/SignatureVerifier/SignatureVerifier.cs +++ b/tools/StaticAnalysis/SignatureVerifier/SignatureVerifier.cs @@ -77,6 +77,8 @@ public void Analyze(IEnumerable cmdletProbingDirs, foreach (var baseDirectory in cmdletProbingDirs.Where(s => !s.Contains("ServiceManagement") && !ModuleFilter.IsAzureStackModule(s) && Directory.Exists(Path.GetFullPath(s)))) { + SharedAssemblyLoader.Load(baseDirectory); + //Add current directory for probing probingDirectories.Add(baseDirectory); probingDirectories.AddRange(Directory.EnumerateDirectories(Path.GetFullPath(baseDirectory)));