diff --git a/CCIProvider/AssemblyTraverser.cs b/CCIProvider/AssemblyTraverser.cs index 65a4af0b..e9730d28 100644 --- a/CCIProvider/AssemblyTraverser.cs +++ b/CCIProvider/AssemblyTraverser.cs @@ -34,10 +34,21 @@ public AssemblyTraverser(Host host, Cci.IMetadataHost cciHost, Cci.PdbReader pdb this.TraverseIntoMethodBodies = false; this.typeExtractor = new TypeExtractor(host); } + + private AssemblyKind AssemblyKindFrom(Cci.IAssembly cciAssembly) + { + switch (cciAssembly.Kind) + { + case Cci.ModuleKind.ConsoleApplication: + case Cci.ModuleKind.WindowsApplication: return AssemblyKind.Exe; + case Cci.ModuleKind.DynamicallyLinkedLibrary: return AssemblyKind.Dll; + default: throw new Exception($"Assembly kind {cciAssembly.Kind} not supported"); + } + } public override void TraverseChildren(Cci.IAssembly cciAssembly) { - var ourAssembly = new Assembly(cciAssembly.Name.Value); + var ourAssembly = new Assembly(cciAssembly.Name.Value, AssemblyKindFrom(cciAssembly)); foreach (var cciReference in cciAssembly.AssemblyReferences) { diff --git a/MetadataProvider/AssemblyExtractor.cs b/MetadataProvider/AssemblyExtractor.cs index 66787d90..b8b17d98 100644 --- a/MetadataProvider/AssemblyExtractor.cs +++ b/MetadataProvider/AssemblyExtractor.cs @@ -171,11 +171,19 @@ public FieldDefinition GetDefinedField(SRM.FieldDefinitionHandle handle) return result; } + + private AssemblyKind AssemblyKindFrom(SRPE.PEHeaders headers) + { + if (headers.IsDll) return AssemblyKind.Dll; + if (headers.IsExe || headers.IsConsoleApplication) return AssemblyKind.Exe; + else throw new Exception("Assembly kind not supported"); + } + public Assembly Extract() { var assemblydef = metadata.GetAssemblyDefinition(); var name = metadata.GetString(assemblydef.Name); - assembly = new Assembly(name); + assembly = new Assembly(name, AssemblyKindFrom(reader.PEHeaders)); foreach (var handle in metadata.AssemblyReferences) { diff --git a/Model/Assembly.cs b/Model/Assembly.cs index 454bae9e..d21501c8 100644 --- a/Model/Assembly.cs +++ b/Model/Assembly.cs @@ -44,16 +44,24 @@ public override bool Equals(object obj) } } + public enum AssemblyKind + { + Exe, + Dll + } + public class Assembly : IAssemblyReference { public string Name { get; private set; } + public AssemblyKind Kind { get; private set; } public IList References { get; private set; } public Namespace RootNamespace { get; set; } - public Assembly(string name) + public Assembly(string name, AssemblyKind kind) { this.Name = name; this.References = new List(); + this.Kind = kind; } public bool MatchReference(IAssemblyReference reference) @@ -69,7 +77,7 @@ public override string ToString() public override int GetHashCode() { - return this.Name.GetHashCode(); + return this.Name.GetHashCode() ^ this.Kind.GetHashCode(); } public override bool Equals(object obj) @@ -77,7 +85,8 @@ public override bool Equals(object obj) var other = obj as Assembly; var result = other != null && - this.Name == other.Name; + this.Name == other.Name && + this.Kind == other.Kind; return result; }