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(); }