/// <summary>Traverses the Assembly recursivly and adds the new ILnodes to the given ILNode</summary> /// <param name="parentNode">The parent ILNode for the new subelements</param> /// <param name="TypDef">The TypeDefinition to read</param> private void LoadSubItemsRecursive(ILNode parentNode, TypeDefinition TypDef) { #region Functions //if (ViewElements.HasFlag(StructureView.functions)) foreach (MethodDefinition MetDef in TypDef.Methods) { StringBuilder strb = new StringBuilder(); StringBuilder strbfn = new StringBuilder(); strb.Append(MetDef.Name); strbfn.Append(MetDef.Name); strb.Append('('); strbfn.Append('('); foreach (ParameterDefinition ParDef in MetDef.Parameters) { strbfn.Append(ParDef.ParameterType.FullName); strb.Append(ParDef.ParameterType.Name); strb.Append(','); strbfn.Append(','); } if (MetDef.Parameters.Count > 0) { strb.Remove(strb.Length - 1, 1); strbfn.Remove(strb.Length - 1, 1); } strb.Append(") : "); strbfn.Append(") : "); strbfn.Append(MetDef.ReturnType.FullName); strb.Append(MetDef.ReturnType.Name); parentNode.Add(strb.ToString(), strbfn.ToString(), MetDef, StructureView.Methods); } #endregion #region Fields //if (ViewElements.HasFlag(StructureView.fields)) foreach (FieldDefinition FieDef in TypDef.Fields) { StringBuilder strb = new StringBuilder(); StringBuilder strbfn = new StringBuilder(); strb.Append(FieDef.Name); strbfn.Append(FieDef.Name); strb.Append(" : "); strbfn.Append(" : "); strbfn.Append(FieDef.FieldType.FullName); strb.Append(FieDef.FieldType.Name); parentNode.Add(strb.ToString(), strbfn.ToString(), FieDef, StructureView.Fields); } #endregion #region SubClasses foreach (TypeDefinition SubTypDef in TypDef.NestedTypes) { ILNode tnSubTypDef = parentNode.Add(SubTypDef.Name, SubTypDef.Name, SubTypDef, StructureView.Classes); LoadSubItemsRecursive(tnSubTypDef, SubTypDef); } #endregion }
/// <summary>Creates an ILNode-Tree representing the structure of the given Assembly /// and stores it in the ModuleList Dictionary with the AssemblyDefinition name as key.</summary> /// <param name="assDef">The AssemblyDefinition which should be loaded into the searchlist</param> /// <param name="subResolveDepth">When the given AssemblyDefinition uses references to other Assemblys /// the method will add them recursivly to the given depth</param> public void LoadAssembly(AssemblyDefinition assDef, int subResolveDepth = 0) { if (assDef == null) { throw new ArgumentNullException(nameof(assDef)); } if (subResolveDepth < 0) { throw new ArgumentException(nameof(subResolveDepth) + " must be non-negative."); } if (IsModuleLoaded(assDef.Name.Name)) { return; } ILNode ilParent = new ILNode(assDef.Name.Name, assDef.FullName, assDef, StructureView.Structure); // StructureView.Module AddModule(assDef.Name.Name, ilParent); foreach (ModuleDefinition ModDef in assDef.Modules) { ILNode tnModDef = ilParent.Add(ModDef.Name, ModDef.Name, ModDef, StructureView.Structure); DefaultAssemblyResolver dar = (DefaultAssemblyResolver)ModDef.AssemblyResolver; Array.ForEach(dar.GetSearchDirectories(), dar.RemoveSearchDirectory); dar.AddSearchDirectory(Path.GetDirectoryName(dataStruct.AssemblyLocation)); // Subresolving references foreach (AssemblyNameReference anr in ModDef.AssemblyReferences) { try { AssemblyDefinition AssSubRef = ModDef.AssemblyResolver.Resolve(anr); tnModDef.Add(anr.Name, AssSubRef.FullName, AssSubRef, StructureView.Structure); if (subResolveDepth > 0) { LoadAssembly(AssSubRef, subResolveDepth - 1); } } catch { Log.Write(Log.Level.Warning, $"AssemblyReference \"{anr.Name}\" couldn't be found for \"{ ModDef.Name}\""); } } Dictionary <string, ILNode> nsDict = new Dictionary <string, ILNode>(); foreach (TypeDefinition TypDef in ModDef.Types) { string nsstr = TypDef.Namespace; ILNode tnAssemblyContainer; if (!nsDict.ContainsKey(nsstr)) { string displaystr = string.IsNullOrEmpty(nsstr) ? "<Default Namespace>" : nsstr; tnAssemblyContainer = ilParent.Add(displaystr, displaystr, new NamespaceHolder(displaystr), StructureView.Namesp); nsDict.Add(nsstr, tnAssemblyContainer); } else { tnAssemblyContainer = nsDict[nsstr]; } ILNode tnTypDef = tnAssemblyContainer.Add(TypDef.Name, TypDef.FullName, TypDef, StructureView.Classes); LoadSubItemsRecursive(tnTypDef, TypDef); } } ilParent.Sort(); if (subResolveDepth == 0) // If this is the last LoadAssembly recursion call then invoke the callback { OnModuleChanged?.Invoke(this); } }