[英]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.