using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Reflection;
using System.IO;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace myClassesTreeGen
{
class Program
{
static void printMembers(Type asmType) {
// check for static ones first
MemberInfo[] members = asmType.GetMembers();
foreach (MemberInfo member in members)
{
Console.WriteLine("Found " + member.MemberType + ": " +
member.ToString() + " IN " +
member.DeclaringType.FullName);
}
}
static void Main(string[] args)
{
Dictionary<String, int> vertexNumbers = new Dictionary<string, int>();
Dictionary<int, String> vertexNames = new Dictionary<int, String>();
Dictionary<int, int> vertexDepth = new Dictionary<int, int>();
Dictionary<String, String> vertexParents = new Dictionary<String, String>();
Dictionary<int, int> vertexParentsByNum = new Dictionary<int, int>();
//Make an array for the list of assemblies.
Assembly[] assems = AppDomain.CurrentDomain.GetAssemblies();
//List the assemblies in the current application domain.
Console.WriteLine("List of assemblies loaded in current appdomain:");
int counter=0;
foreach (Assembly assem in assems)
{
Console.WriteLine(assem.FullName);
Type[] types = assem.GetTypes();
foreach (Type t in types)
if (t.IsClass)
//if (t.ToString()=="System.Type")
{
//Console.WriteLine(" ===============================================================\n" + t.ToString());//t.GetGenericTypeDefinition().ToString()+
//Console.WriteLine(" ===============================================================\n");
//printMembers(t)
int value;
if (!vertexNumbers.TryGetValue(t.ToString(),out value))
{
vertexNumbers.Add(t.ToString(), counter);
vertexNames.Add(counter, t.ToString());
if (t.BaseType != null )
vertexParents.Add(t.ToString(), t.BaseType.ToString() );
}
//Console.WriteLine((t.BaseType!=null?t.BaseType.ToString():"")+" --> "+t.ToString());
counter++;
}
}
int i;
foreach (KeyValuePair<String, String> de in vertexParents) {
// Console.WriteLine("{0}->{1}", de.Key, de.Value);
if (vertexNumbers.TryGetValue(de.Value, out i))
vertexParentsByNum.Add(vertexNumbers[de.Key], vertexNumbers[de.Value]);
}
StreamWriter fout = new StreamWriter(@"E:\!\NETCODE_CSharp\graph.dot");
fout.WriteLine("digraph {");
fout.WriteLine(" rankdir = LR; ");
foreach (KeyValuePair<int, String> de in vertexNames) //if (allowedVertex[de.Key] != null)
{
fout.WriteLine(" T{0}[label=\"{1}\"]", de.Key, de.Value);
}
///////////////// узлы корневые ////
int rootCount = 0;
const int rootStart = 10000;
foreach (KeyValuePair<int, int> de in vertexParentsByNum) if (de.Value == 0) rootCount++;
for (int j = 0; j < rootCount; j++)
{
fout.WriteLine(" T{0}[label=\"{1}\"]", rootStart + j, "System.Object");
}
///на одном уровне их!
fout.WriteLine("{ rank=same;");
foreach (KeyValuePair<int, int> de in vertexParentsByNum) if (de.Value==0)
{
fout.WriteLine(" T{0};", de.Key);
}
fout.WriteLine("}");
//все пары
counter = 0;
foreach (KeyValuePair<int, int> de in vertexParentsByNum)
{
fout.WriteLine(" T{0} -> T{1}", de.Value == 0 ? rootStart + (counter++) : de.Value, de.Key);
}
fout.WriteLine(" }");
fout.Close();
Console.WriteLine("Vertex count: {0}", vertexNames.Count);
//Console.WriteLine("Edges count: {0}", vertexParents.Count);
Console.ReadLine();
}
}
}
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("windows-1251")
foreach ($arg in $args) {
& $arg | tee log.txt -append
}