2016-03-05 23 views
7

Tôi đã xây dựng nguồn Roslyn là described here.Bước qua trình biên dịch Roslyn C#

Tôi muốn thêm một breakpoint trong biên dịch C# và bước qua compliation của chương trình đơn giản này:

using System; 

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

      Console.WriteLine(result); 
     } 
    } 
} 

tôi nên thiết lập một breakpoint ở đâu? Nó cần được sớm trong quá trình biên dịch như tôi muốn bước qua phân tích cú pháp và thậm chí lexing.

Nếu tôi đặt CompilerExtension làm dự án khởi động và nhấn F5 (Bắt đầu gỡ lỗi), một bản sao của Visual Studio được khởi chạy chạy trình biên dịch mới được xây dựng. Tôi muốn tránh phải khởi động một thể hiện mới của Visual Studio mỗi khi tôi muốn bước qua trình biên dịch. Một cách tốt để thiết lập một chương trình nhỏ gọi mã trình biên dịch trên nguồn trên trực tiếp là gì?

+5

Bạn có thể thêm dự án mới vào giải pháp Roslyn, thêm tham chiếu vào các dự án Microsoft.CodeAnalysis chính xác và sau đó gọi 'CSharpSyntaxTree.ParseText()' và 'Compilation.Emit()'. Sau đó, bạn có thể bước qua mã phân tích hoặc phát ra mà bạn quan tâm. – JoshVarty

+0

Cảm ơn Josh! Tôi đã thêm một câu trả lời thể hiện 'ParseText'. @JoshVarty – dharmatech

+1

Tôi đã viết một bài viết trên blog dựa trên những gì @JoshVarty đề xuất ở đây và trong một trong các bài viết trên blog của anh ấy. Điều này có thể được quan tâm cho bất cứ ai muốn chơi xung quanh với Roslyn internals. https://renniestechblog.com/information/33-modifying-roslyn-step-1-initial-test – RenniePet

Trả lời

5

Đây là một cách tiếp cận theo đề xuất của Josh trong một bình luận ở trên.

  • Thêm dự án "Ứng dụng bảng điều khiển" mới vào giải pháp Roslyn.

  • Thêm hai người giới thiệu những dự án:

enter image description here

Một chương trình đơn giản để kiểm tra phân tích cú pháp:

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); 
     } 
    } 
} 
  • Thêm một breakpoint vào dòng đó gọi số ParseText.

  • "Bắt đầu gỡ lỗi" và bước vào dòng đó để nghiên cứu sâu vào trình phân tích cú pháp.

Một chương trình đơn giản để kiểm tra trình biên dịch thông qua 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

Đối với phiên bản hiện tại của Roslyn và cho Visual Studio 2017, bạn cũng cần phải thêm tham chiếu đến gói NuGet cho System.Reflection .Metadata, Phiên bản = 1.4.2. Cho đến khi tôi quyết định rằng (và nó đã cho tôi một thời gian dài) Tôi đã nhận được "Các ứng dụng đang ở chế độ nghỉ", và đã không thể làm bất cứ điều gì cả. Điều này có thể do lỗi trong Visual Studio https://developercommunity.visualstudio.com/content/problem/104485/the-application-is-in-break-mode-1.html Điều cuối cùng đã cung cấp đầu mối cho vấn đề thực sự là khi tôi nhấp đúp vào tệp .exe đã tạo - sau đó tôi gặp lỗi trong cửa sổ bảng điều khiển. – RenniePet

2

Nếu bạn muốn có một chương trình đơn giản để gọi trình biên dịch, chỉ cần xem xét sử dụng csc như dự án khởi động của bạn. Bạn có thể chỉ định các đối số để truyền (như các tệp nguồn) từ các thiết lập gỡ lỗi trên dự án.

+0

Cảm ơn Jason! Tôi hiện đang khám phá cách tiếp cận được Josh đề cập trong một bình luận ở trên. Nó có vẻ hoạt động tốt cho đến nay. Tôi đã thêm một câu trả lời mô tả cách tiếp cận đó. – dharmatech

+0

Điều này có vẻ giống như cách hợp lý để kiểm tra trình biên dịch Roslyn trong trình gỡ rối Visual Studio. Nhưng có rất nhiều đối số có thể cho csc.exe. Bạn có một liên kết hoặc một gợi ý về các đối số nào là cần thiết và các đối số bổ sung nào có thể là một ý tưởng tốt để sử dụng? – RenniePet

Các vấn đề liên quan