Example #1
0
        /// <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
        }
Example #2
0
        /// <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);
            }
        }