2016-10-26 12 views
0

Im пытается сделать вывод ildasm более похожим на json или xml, чтобы его несколько легко было программно прочитать.Каков наилучший способ программно читать вывод ildasm

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

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

+0

Приведите пример * output * и что вы хотите с ним сделать. В настоящее время я не могу выбрать между [this] (http://stackoverflow.com/q/6792828/1997232) и [this] (http://stackoverflow.com/q/284324/1997232) дубликат (или просто * широкий * vs * непонятно *). – Sinatr

+2

Зачем идти через ildasm? Кажется, что проще читать двоичный файл напрямую. Сесил - это библиотека, которая может помочь. https://github.com/jbevain/cecil/wiki – adrianm

+0

Выход 'ildasm' не предназначен для чтения программным путем ничем иным, как' ilasm'. Таким образом, безумие. –

ответ

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]*)+\("); 

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

перебирать файл построчно и проверьте, есть ли строка название "Класс". если у него есть имя, то разделите значения и сохраните значение/текст, который приходит после имени «Класс», который является ничем иным, как 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, как описано выше.

Ping us если у вас возникли проблемы.