簡體   English   中英

單步執行Roslyn C#編譯器

[英]Stepping through the Roslyn C# compiler

我已經構建了如此處所述的Roslyn源代碼。

我想在C#編譯器中添加一個斷點,並逐步完成這個簡單程序的補充:

using System;

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

            Console.WriteLine(result);
        }
    }
}

我應該在哪里設置斷點? 它應該在編譯過程的早期,因為我想逐步解析甚至是lexing。

如果我將CompilerExtension設置為啟動項目並按F5(開始調試),則會啟動運行新構建的編譯器的Visual Studio副本。 我想避免每次我想要逐步完成編譯器時都啟動一個新的Visual Studio實例。 設置一個直接在上面的源上調用編譯器代碼的小程序有什么好方法?

以下是Josh在上述評論中提出的一種方法。

  • 向Roslyn解決方案添加一個新的“控制台應用程序”項目。

  • 將這兩個引用添加到項目中:

在此輸入圖像描述

一個測試解析器的簡單程序:

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

如果你想擁有一個調用編譯器的簡單程序,只需考慮使用csc作為你的啟動項目。 您可以從項目的調試設置中指定要傳遞的參數(如源文件)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM