2016-03-05 5 views
7

Я построил источник Roslyn как described here.Прохождение через компилятор Roslyn C#

Я хотел бы добавить контрольную точку в C# компилятор и пошагово compliation этой простой программы:

using System; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var result = 1 + 2; 

      Console.WriteLine(result); 
     } 
    } 
} 

Где я должен установить точку останова? Это должно быть на раннем этапе процесса компиляции, поскольку я хотел бы пройти синтаксический анализ и даже лексирование.

Если я установил CompilerExtension в качестве проекта запуска и нажал F5 («Начать отладку»), будет запущена копия Visual Studio с запущенным недавно созданным компилятором. Я бы хотел, чтобы не запускать новый экземпляр Visual Studio каждый раз, когда я хотел бы пройти через компилятор. Каков хороший способ настроить небольшую программу, которая напрямую вызывает код компилятора в указанном выше источнике?

+5

Вы можете добавить новый проект в решение Roslyn, добавить ссылки на правильные проекты Microsoft.CodeAnalysis и затем вызвать 'CSharpSyntaxTree.ParseText()' и 'Compilation.Emit()'. Затем вы можете выполнить любой синтаксический анализ или код, который вас интересует. – JoshVarty

+0

Спасибо, Джош! Я добавил ответ, который демонстрирует «ParseText». @JoshVarty – dharmatech

+1

Я написал статью в блоге, основанную на том, что @JoshVarty предлагает здесь и в одной из своих статей в блоге. Это может представлять интерес для тех, кто хочет поиграть с внутренними лицами Roslyn. https://renniestechblog.com/information/33-modification-roslyn-step-1-initial-test – RenniePet

ответ

5

Вот один из подходов, предложенный Джошем в комментарии выше.

  • Добавить новое проект «Консольное приложение» в решение Roslyn.

  • Добавьте эти две ссылки на проект:

enter image description here

Простая программа для тестирования анализатор:

using Microsoft.CodeAnalysis.CSharp; 

namespace TestCompiler 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var program_text = @" 

       using System; 

       namespace ConsoleApplication2 
       { 
        class Program 
        { 
         static void Main(string[] args) 
         { var result = 2 + 3; Console.WriteLine(result); } 
        } 
       } 
      "; 

      var result = CSharpSyntaxTree.ParseText(program_text); 
     } 
    } 
} 
  • Добавить контрольную точку на линии, звонки ParseText.

  • «Начать отладки» и входить в эту строку, чтобы вникать в синтаксический анализатор.

Простая программа для тестирования компилятора с помощью Emit:

using System; 
using System.IO; 
using Microsoft.CodeAnalysis; 
using Microsoft.CodeAnalysis.CSharp; 

namespace TestCompiler 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var program_text = @" 

       using System; 

       namespace ConsoleApplication2 
       { 
        class Program 
        { 
         static void Main(string[] args) 
         { var result = 2 + 3; Console.WriteLine(result); } 
        } 
       } 
      "; 

      var syntax_tree = CSharpSyntaxTree.ParseText(program_text); 

      var compilation = CSharpCompilation.Create(
       Guid.NewGuid().ToString("D"), 
       new[] { syntax_tree }, 
       new[] { MetadataReference.CreateFromFile(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\mscorlib.dll") }); 

      var emit_result = compilation.Emit(new MemoryStream()); 
     } 
    } 
} 
+1

Для текущей версии Roslyn и Visual Studio 2017 вам также необходимо добавить ссылку на пакет NuGet для System.Reflection .Metadata, Version = 1.4.2. Пока я не определил, что (и это заняло у меня много времени), я получал «Приложение в режиме разлома» и не смог ничего сделать. Это может быть связано с ошибкой в ​​Visual Studio https://developercommunity.visualstudio.com/content/problem/104485/the-application-is-in-break-mode-1.html Что в конечном итоге предоставило ключ к реальной проблеме когда я дважды щелкнул по сгенерированному файлу .exe - тогда я получил ошибку в окне консоли. – RenniePet

2

Если вы хотите иметь простую программу, которая вызывает компилятор, просто рассмотреть вопрос об использовании CSC в качестве проекта запуска. Вы можете указать аргументы для передачи (например, исходные файлы) из параметров отладки в проекте.

+0

Спасибо, Джейсон! В настоящее время я изучаю подход, упомянутый Джошем в комментарии выше. Кажется, он работает до сих пор. Я добавил ответ, описывающий этот подход. – dharmatech

+0

Это похоже на логический способ тестирования компилятора Roslyn под отладчиком Visual Studio. Но для csc.exe существует так много возможных аргументов. У вас есть ссылка или предложение о том, какие аргументы необходимы и какие дополнительные аргументы могут быть полезны для использования? – RenniePet

Смежные вопросы