Ejemplo n.º 1
0
        protected void UpdateTree()
        {
            treeView.BeginUpdate();
            treeView.Nodes.Clear();

            foreach (ITypeModule module in typeSystem.TypeModules)
            {
                TreeNode moduleNode = new TreeNode(module.Name);
                treeView.Nodes.Add(moduleNode);

                foreach (RuntimeType type in module.GetAllTypes())
                {
                    TreeNode typeNode = new TreeNode(FormatRuntimeType(type));
                    moduleNode.Nodes.Add(typeNode);

                    if (type.BaseType != null)
                    {
                        TreeNode baseTypeNode = new TreeNode("Base Type: " + FormatRuntimeType(type.BaseType));
                        typeNode.Nodes.Add(baseTypeNode);
                    }

                    CilGenericType genericType = type as CilGenericType;
                    if (genericType != null)
                    {
                        if (genericType.BaseGenericType != null)
                        {
                            TreeNode genericBaseTypeNode = new TreeNode("Generic Base Type: " + FormatRuntimeType(genericType.BaseGenericType));
                            typeNode.Nodes.Add(genericBaseTypeNode);
                        }
                    }

                    CilGenericType genericOpenType = typeSystem.GetOpenGeneric(type);
                    if (genericOpenType != null)
                    {
                        TreeNode genericOpenTypeNode = new TreeNode("Open Generic Type: " + FormatRuntimeType(genericOpenType));
                        typeNode.Nodes.Add(genericOpenTypeNode);
                    }


                    if (type.GenericParameters.Count != 0)
                    {
                        TreeNode genericParameterNodes = new TreeNode("Generic Parameters");
                        typeNode.Nodes.Add(genericParameterNodes);

                        foreach (GenericParameter genericParameter in type.GenericParameters)
                        {
                            TreeNode GenericParameterNode = new TreeNode(genericParameter.Name);
                            genericParameterNodes.Nodes.Add(GenericParameterNode);
                        }
                    }

                    if (type.Interfaces.Count != 0)
                    {
                        TreeNode interfacesNodes = new TreeNode("Interfaces");
                        typeNode.Nodes.Add(interfacesNodes);

                        foreach (RuntimeType interfaceType in type.Interfaces)
                        {
                            TreeNode interfaceNode = new TreeNode(FormatRuntimeType(interfaceType));
                            interfacesNodes.Nodes.Add(interfaceNode);
                        }
                    }

                    if (type.Fields.Count != 0)
                    {
                        TreeNode fieldsNode = new TreeNode("Fields");
                        if (showSizes.Checked)
                        {
                            fieldsNode.Text = fieldsNode.Text + " (Count: " + type.Fields.Count.ToString() + " - Size: " + typeLayout.GetTypeSize(type).ToString() + ")";
                        }
                        typeNode.Nodes.Add(fieldsNode);

                        foreach (RuntimeField field in type.Fields)
                        {
                            TreeNode fieldNode = new TreeNode(FormatRuntimeMember(field));
                            fieldsNode.Nodes.Add(fieldNode);

                            if (field.IsStaticField)
                            {
                                fieldNode.Text = fieldNode.Text + " [Static]";
                            }

                            if (showSizes.Checked)
                            {
                                fieldNode.Text = fieldNode.Text + " (Size: " + typeLayout.GetFieldSize(field).ToString();

                                if (!field.IsStaticField)
                                {
                                    fieldNode.Text = fieldNode.Text + " - Offset: " + typeLayout.GetFieldOffset(field).ToString();
                                }

                                fieldNode.Text = fieldNode.Text + ")";
                            }
                        }
                    }

                    if (type.Methods.Count != 0)
                    {
                        TreeNode methodsNode = new TreeNode("Methods");
                        typeNode.Nodes.Add(methodsNode);

                        foreach (RuntimeMethod method in type.Methods)
                        {
                            TreeNode methodNode = new TreeNode(FormatRuntimeMember(method));
                            methodsNode.Nodes.Add(methodNode);

                            if ((method.Attributes & MethodAttributes.Static) == MethodAttributes.Static)
                            {
                                methodNode.Text = methodNode.Text + " [Static]";
                            }

                            if (method.IsAbstract)
                            {
                                methodNode.Text = methodNode.Text + " [Abstract]";
                            }
                        }
                    }

                    if (typeLayout.GetMethodTable(type) != null)
                    {
                        TreeNode methodTableNode = new TreeNode("Method Table");
                        typeNode.Nodes.Add(methodTableNode);

                        foreach (RuntimeMethod method in typeLayout.GetMethodTable(type))
                        {
                            TreeNode methodNode = new TreeNode(FormatRuntimeMember(method));
                            methodTableNode.Nodes.Add(methodNode);
                        }
                    }
                }
            }

            treeView.EndUpdate();
        }