Как лучше всего программно читать вывод ildasm

Я пытаюсь сделать вывод ildasm более похожим на json или xml, чтобы его было несколько легко читать программно.

То, как я намеревался сделать это, читая вывод построчно, а затем добавляя классы и методы и т. Д. В списки, а затем изменяя и переписывая его как xml, а затем читая его.

Вопрос: Есть ли более умные или простые способы чтения вывода?


person eim64    schedule 26.10.2016    source источник
comment
Приведите пример output и что вы хотите с ним сделать. В настоящее время я не могу выбрать между этим и этот дубликат (или просто широкий vs неясный).   -  person Sinatr    schedule 26.10.2016
comment
Зачем идти через ильдасм? Кажется, легче читать двоичный файл напрямую. Cecil — это библиотека, которая может помочь. github.com/jbevain/cecil/wiki   -  person adrianm    schedule 26.10.2016
comment
Вывод ildasm не предназначен для программного чтения ничем, кроме ilasm. На этом пути лежит безумие.   -  person Jeroen Mostert    schedule 26.10.2016


Ответы (1)


Есть способ получить список классов и методов, прочитав IL Code. Решение, о котором я говорю, может быть немного длинным, но оно будет работать.

IL — это не что иное, как .exe или .dll. Сначала попробуйте преобразовать его в C# или VB с помощью ILSpy . Загрузите этот инструмент и откройте в нем свою DLL. Этот инструмент может преобразовать ваш IL-код в C# или VB.

После преобразования сохраните преобразованный код в текстовый файл.

Затем прочитайте текстовый файл и найдите в нем классы и методы.

Чтобы прочитать имена методов:

   MatchCollection mc = Regex.Matches(str, @"(\s)([A-Z]+[a-z]+[A-Z]*)+\(");

Чтобы прочитать имена классов:

Переберите файл построчно и проверьте, имеет ли строка имя "Class" . если у него есть имя, затем разделите значения и сохраните значение/текст, который следует за именем "Class", которое есть не что иное, как ClassName.

Полный код:

  static void Main(string[] args)
    {
        string line;
        List<string> classLst = new List<string>();
        List<string> methodLst = new List<string>();
        System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Users\******\Desktop\TreeView.txt");
        string str = File.ReadAllText(@"C:\Users\*******\Desktop\TreeView.txt");

        while ((line = file.ReadLine()) != null)
        {      
                if (line.Contains("class")&&!line.Contains("///"))
                {
                    // for finding class names

                    int si = line.IndexOf("class");
                    string followstring = line.Substring(si);
                    if (!string.IsNullOrEmpty(followstring))
                    {
                        string[] spilts = followstring.Split(' ');

                        if(spilts.Length>1)
                        {
                            classLst.Add(spilts[1].ToString());
                        }

                    }
                }
        }
        MatchCollection mc = Regex.Matches(str, @"(\s)([A-Z]+[a-z]+[A-Z]*)+\(");

        foreach (Match m in mc)
        {
            methodLst.Add(m.ToString().Substring(1, m.ToString().Length - 2));
            //Console.WriteLine(m.ToString().Substring(1, m.ToString().Length - 2));
        }

        file.Close();
        Console.WriteLine("******** classes ***********");
        foreach (var item in classLst)
        {
            Console.WriteLine(item);
        }
        Console.WriteLine("******** end of classes ***********");

        Console.WriteLine("******** methods ***********");
        foreach (var item in methodLst)
        {
            Console.WriteLine(item);
        }

        Console.WriteLine("******** end of methods ***********");
        Console.ReadKey();

    }

Здесь я сохраняю имена классов и имена методов в списке. позже вы можете сохранить их в XML или JSON, как описано выше.

Пингуйте нас, если у вас возникнут какие-либо проблемы.

person Sai Bhasker Raju    schedule 27.10.2016