private AssemblyRecord CreateAssemblyRecord(string path) { AssemblyRecord result = null; var fullPath = Path.GetFullPath(path); try { var assembly = LoadByReflectionFromFile(fullPath); var versionInfo = FileVersionInfo.GetVersionInfo(fullPath); result = new AssemblyRecord { AssemblyName = assembly.GetName(), AssemblyFileMajorVersion = versionInfo.FileMajorPart, AssemblyFileMinorVersion = versionInfo.FileMinorPart, Location = fullPath }; foreach (var child in assembly.GetReferencedAssemblies()) { result.Children.Add(child); } } catch { Logger.WriteError("Error loading assembly {0}", fullPath); } return(result); }
private bool AddSharedAssemblyExactVersion(AssemblyRecord record) { if (_identicalSharedAssemblies.ContainsKey(record.Name)) { var stored = _identicalSharedAssemblies[record.Name]; if (!record.Equals(stored) && !(IsFrameworkAssembly(record.AssemblyName))) { _sharedConflictLogger.LogRecord(new SharedAssemblyConflict { AssemblyName = record.Name, AssemblyVersion = record.Version, Severity = 0, AssemblyPathsAndFileVersions = new List <Tuple <string, Version> >() { new Tuple <string, Version>(record.Location, new Version(record.AssemblyFileMajorVersion, record.AssemblyFileMinorVersion)), new Tuple <string, Version>(stored.Location, new Version(stored.AssemblyFileMajorVersion, stored.AssemblyFileMinorVersion)), }, Description = string.Format("Assembly {0} has multiple versions as specified in 'Target'", record.Name), Remediation = string.Format("Ensure that all packages reference exactly the same package " + "version of {0}", record.Name) }); return(false); } } else { _identicalSharedAssemblies[record.Name] = record; } return(true); }
private void ProcessDirectory(string directoryPath) { var savedDirectory = Directory.GetCurrentDirectory(); Directory.SetCurrentDirectory(directoryPath); _loader = EnvironmentHelpers.CreateProxy <AssemblyLoader>(directoryPath, out _testDomain); foreach (var file in Directory.GetFiles(directoryPath).Where(file => file.EndsWith(".dll"))) { AssemblyRecord assembly = CreateAssemblyRecord(file); _assemblies[assembly.Name] = assembly; if (RequiresExactVersionMatch(assembly)) { AddSharedAssemblyExactVersion(assembly); } else { AddSharedAssembly(assembly); } } // Now check for assembly mismatches foreach (var assembly in _assemblies.Values) { foreach (var reference in assembly.Children) { CheckAssemblyReference(reference, assembly); } } FindExtraAssemblies(); AppDomain.Unload(_testDomain); Directory.SetCurrentDirectory(savedDirectory); }
private void CheckAssemblyReference(AssemblyName reference, AssemblyRecord parent) { if (_assemblies.ContainsKey(reference.Name)) { var stored = _assemblies[reference.Name]; if (stored.Equals(reference)) { stored.ReferencingAssembly.Add(parent); } else if (reference.Version.Major == 0 && reference.Version.Minor == 0) { Logger.WriteWarning("{0}.dll has reference to assembly {1} without any version specification.", parent.Name, reference.Name); _versionConflictLogger.LogRecord(new AssemblyVersionConflict() { AssemblyName = reference.Name, ActualVersion = stored.Version, ExpectedVersion = reference.Version, ParentAssembly = parent.Name, Severity = 2, Description = string.Format("Assembly {0} referenced from {1}.dll does not specify any " + "assembly version evidence. The assembly will use version " + "{2} from disk.", reference.Name, parent.Name, stored.Version), Remediation = string.Format("Update the reference to assembly {0} from {1} so that " + "assembly version evidence is supplied", reference.Name, parent.Name) }); } else { var minVersion = (stored.Version < reference.Version) ? stored.Version : reference.Version; _versionConflictLogger.LogRecord(new AssemblyVersionConflict() { AssemblyName = reference.Name, ActualVersion = stored.Version, ExpectedVersion = reference.Version, ParentAssembly = parent.Name, Severity = 1, Description = string.Format("Assembly {0} version {1} referenced from {2}.dll does " + "not match assembly version on disk: {3}", reference.Name, reference.Version, parent.Name, stored.Version), Remediation = string.Format("Update any references to version {0} of assembly {1}", minVersion, reference.Name) }); } } else if (!IsFrameworkAssembly(reference)) { _missingAssemblyLogger.LogRecord(new MissingAssembly { AssemblyName = reference.Name, AssemblyVersion = reference.Version.ToString(), ReferencingAssembly = parent.Name, Severity = 0, Description = string.Format("Missing assembly {0} referenced from {1}", reference.Name, parent.Name), Remediation = "Ensure that the assembly is included in the Wix file or directory" }); } }
private bool AddSharedAssembly(AssemblyRecord assembly) { if (_sharedAssemblyReferences.ContainsKey(assembly.AssemblyName)) { var stored = _sharedAssemblyReferences[assembly.AssemblyName]; if (!assembly.Equals(stored) && !(IsFrameworkAssembly(assembly.AssemblyName) && assembly.Version.Major <= 4)) { _sharedConflictLogger.LogRecord(new SharedAssemblyConflict { AssemblyName = assembly.Name, AssemblyPathsAndFileVersions = new List <Tuple <string, Version> >() { new Tuple <string, Version>(assembly.Location, new Version(assembly.AssemblyFileMajorVersion, assembly.AssemblyFileMinorVersion)), new Tuple <string, Version>(stored.Location, new Version(stored.AssemblyFileMajorVersion, stored.AssemblyFileMinorVersion)) }, AssemblyVersion = assembly.Version, Severity = 0, Description = "Shared assembly conflict, shared assemblies with the same assembly " + "version have differing file versions", Remediation = string.Format("Update the assembly reference for {0} in one of the " + "referring assemblies", assembly.Name) }); return(false); } } else { _sharedAssemblyReferences[assembly.AssemblyName] = assembly; } return(true); }
private void ProcessDirectory(string directoryPath) { var savedDirectory = Directory.GetCurrentDirectory(); Directory.SetCurrentDirectory(directoryPath); _loader = #if !NETSTANDARD EnvironmentHelpers.CreateProxy <AssemblyLoader>(directoryPath, out _testDomain); #else new AssemblyLoader(); #endif foreach (var file in Directory.GetFiles(directoryPath).Where(file => file.EndsWith(".dll"))) { AssemblyRecord assembly = CreateAssemblyRecord(file); _assemblies[assembly.Name] = assembly; if (RequiresExactVersionMatch(assembly)) { AddSharedAssemblyExactVersion(assembly); } else { AddSharedAssembly(assembly); } } // Now check for assembly mismatches foreach (var assembly in _assemblies.Values) { foreach (var reference in assembly.Children) { CheckAssemblyReference(reference, assembly); } } foreach (var assembly in _assemblies.Values) { foreach (var parent in assembly.ReferencingAssembly) { _dependencyMapLogger.LogRecord( new DependencyMap { AssemblyName = assembly.Name, AssemblyVersion = assembly.Version.ToString(), ReferencingAssembly = parent.Name, ReferencingAssemblyVersion = parent.Version.ToString(), Severity = 3 }); } } FindExtraAssemblies(); #if !NETSTANDARD AppDomain.Unload(_testDomain); #endif Directory.SetCurrentDirectory(savedDirectory); }
private bool AddSharedAssembly(AssemblyRecord assembly) { if (_sharedAssemblyReferences.ContainsKey(assembly.AssemblyName)) { 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 { AssemblyName = assembly.Name, AssemblyPathsAndFileVersions = new List <Tuple <string, Version> > { new Tuple <string, Version>(assembly.Location, new Version(assembly.AssemblyFileMajorVersion, assembly.AssemblyFileMinorVersion)), new Tuple <string, Version>(stored.Location, new Version(stored.AssemblyFileMajorVersion, stored.AssemblyFileMinorVersion)) }, AssemblyVersion = assembly.Version, Severity = 0, ProblemId = AssemblyVersionFileVersionMismatch, Description = "Shared assembly conflict, shared assemblies with the same assembly " + "version have differing file versions", Remediation = string.Format("Update the assembly reference for {0} in one of the " + "referring assemblies", assembly.Name) }); return(false); } _sharedAssemblyReferences[assembly.AssemblyName] = assembly; return(true); }
//Check 1: Cmdlets assembly must not reference assembly in directory ModuleAlcAssemblies other than AlcWrapper //Check 2: AlcWrapper must be in directory ModuleAlcAssemblies //Return : Whether it is AlcWrapper assemlby and be directly referenced private bool CheckDirectReferenceToAlcWrapperAssembly(HashSet <string> moduleAlcAssemblyNameSet, AssemblyRecord parent, AssemblyName reference) { bool alcWrapperIsReferenced = false; if (moduleAlcAssemblyNameSet?.Contains(reference.Name) == true) { if (!reference.Name.Contains(AlcWrapperAssemblyKeyWord)) { //Add one error record:module assembly must not reference assembly in directory ModuleAlcAssemblies other than AlcWrapper _dependencyMapLogger.LogRecord( new DependencyMap { AssemblyName = reference.Name, AssemblyVersion = reference.Version.ToString(), ReferencingAssembly = parent.Name, ReferencingAssemblyVersion = parent.Version.ToString(), Severity = 1, Description = $"Per ALC design guideline, module assembly {parent.Name} must not reference assemblies in directory ModuleAlcAssemblies other than AlcWrapper.", }); } else { alcWrapperIsReferenced = true; } } else if (reference.Name.Contains(AlcWrapperAssemblyKeyWord)) { //Add one error record, AlcWrapper is referenced by module assembly but not in directory ModuleAlcAssemblies _dependencyMapLogger.LogRecord( new DependencyMap { AssemblyName = reference.Name, AssemblyVersion = reference.Version.ToString(), ReferencingAssembly = parent.Name, ReferencingAssemblyVersion = parent.Version.ToString(), Severity = 1, Description = $"Per ALC design guideline, ALC assembly {reference.Name} must be put in directory ModuleAlcAssemblies.", }); } return(alcWrapperIsReferenced); }
public bool Equals(AssemblyRecord record) { return(Equals(record.AssemblyName) && AssemblyFileMajorVersion == record.AssemblyFileMajorVersion && AssemblyFileMinorVersion == record.AssemblyFileMinorVersion); }
public bool Equals(AssemblyRecord record) { return Equals(record.AssemblyName) && AssemblyFileMajorVersion == record.AssemblyFileMajorVersion && AssemblyFileMinorVersion == record.AssemblyFileMinorVersion; }
private static bool IsCommandAssembly(AssemblyRecord assembly) { return assembly.Name.Contains("Commands") || assembly.Name.Contains("Cmdlets"); }
private static bool RequiresExactVersionMatch(AssemblyRecord name) { return name.Name.Contains("Microsoft.Azure.Common.Authentication"); }
private bool AddSharedAssemblyExactVersion(AssemblyRecord record) { if (_identicalSharedAssemblies.ContainsKey(record.Name)) { var stored = _identicalSharedAssemblies[record.Name]; if (!record.Equals(stored) && !(IsFrameworkAssembly(record.AssemblyName))) { _sharedConflictLogger.LogRecord(new SharedAssemblyConflict { AssemblyName = record.Name, AssemblyVersion = record.Version, Severity = 0, AssemblyPathsAndFileVersions = new List<Tuple<string, Version>>() { new Tuple<string, Version>(record.Location, new Version(record.AssemblyFileMajorVersion, record.AssemblyFileMinorVersion)), new Tuple<string, Version>(stored.Location, new Version(stored.AssemblyFileMajorVersion, stored.AssemblyFileMinorVersion)), }, Description = string.Format("Assembly {0} has multiple versions as specified in 'Target'", record.Name), Remediation = string.Format("Ensure that all packages reference exactly the same package " + "version of {0}", record.Name) }); return false; } } else { _identicalSharedAssemblies[record.Name] = record; } return true; }
private bool AddSharedAssembly(AssemblyRecord assembly) { if (_sharedAssemblyReferences.ContainsKey(assembly.AssemblyName)) { var stored = _sharedAssemblyReferences[assembly.AssemblyName]; if (!assembly.Equals(stored) && !(IsFrameworkAssembly(assembly.AssemblyName) && assembly.Version.Major <= 4)) { _sharedConflictLogger.LogRecord(new SharedAssemblyConflict { AssemblyName = assembly.Name, AssemblyPathsAndFileVersions = new List<Tuple<string, Version>>() { new Tuple<string, Version>(assembly.Location, new Version(assembly.AssemblyFileMajorVersion, assembly.AssemblyFileMinorVersion)), new Tuple<string, Version>(stored.Location, new Version(stored.AssemblyFileMajorVersion, stored.AssemblyFileMinorVersion)) }, AssemblyVersion = assembly.Version, Severity = 0, Description = "Shared assembly conflict, shared assemblies with the same assembly " + "version have differing file versions", Remediation = string.Format("Update the assembly reference for {0} in one of the " + "referring assemblies", assembly.Name) }); return false; } } else { _sharedAssemblyReferences[assembly.AssemblyName] = assembly; } return true; }
private static bool RequiresExactVersionMatch(AssemblyRecord name) { return(name.Name.Contains("Microsoft.Azure.Common.Authentication")); }
private static bool IsCommandAssembly(AssemblyRecord assembly) { return(assembly.Name.Contains("Commands") || assembly.Name.Contains("Cmdlets")); }
private AssemblyRecord CreateAssemblyRecord(string path) { AssemblyRecord result = null; var fullPath = Path.GetFullPath(path); try { var assembly = LoadByReflectionFromFile(fullPath); var versionInfo = FileVersionInfo.GetVersionInfo(fullPath); result = new AssemblyRecord() { AssemblyName = assembly.GetName(), AssemblyFileMajorVersion = versionInfo.FileMajorPart, AssemblyFileMinorVersion = versionInfo.FileMinorPart, Location = fullPath }; foreach (var child in assembly.GetReferencedAssemblies()) { result.Children.Add(child); } } catch { Logger.WriteError("Error loading assembly {0}", fullPath); } return result; }