Information about assemblies
Inheritance: ICloneable
        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);
        }
示例#7
0
        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);
        }
示例#8
0
        //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);
        }
示例#9
0
 public bool Equals(AssemblyRecord record)
 {
     return(Equals(record.AssemblyName) &&
            AssemblyFileMajorVersion == record.AssemblyFileMajorVersion &&
            AssemblyFileMinorVersion == record.AssemblyFileMinorVersion);
 }
示例#10
0
 public bool Equals(AssemblyRecord record)
 {
     return Equals(record.AssemblyName)
         && AssemblyFileMajorVersion == record.AssemblyFileMajorVersion
         && AssemblyFileMinorVersion == record.AssemblyFileMinorVersion;
 }
 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 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;
        }