2016-03-05 9 views
7

मैं described here के रूप में रोसलिन स्रोत का निर्माण किया है के माध्यम से कदम।रोसलिन सी # संकलक

मैं सी # संकलक में एक ब्रेकपाइंट जोड़ सकते हैं और इस सरल कार्यक्रम के compliation से निकलने के लिए करना चाहते हैं:

using System; 

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

      Console.WriteLine(result); 
     } 
    } 
} 

मैं एक ब्रेकपाइंट कहाँ सेट करना चाहिए? यह संकलन प्रक्रिया में जल्दी होना चाहिए क्योंकि मैं पार्सिंग और यहां तक ​​कि लेक्सिंग के माध्यम से कदम उठाना चाहता हूं।

अगर मैं स्टार्टअप परियोजना के रूप में CompilerExtension सेट और F5 (प्रारंभ डिबगिंग) मारा, विजुअल स्टूडियो की एक प्रति नव निर्मित संकलक चल रहा शुरू की है। जब भी मैं कंपाइलर के माध्यम से कदम उठाना चाहता हूं, तो मैं विजुअल स्टूडियो का एक नया उदाहरण लॉन्च करने से बचना चाहता हूं। एक छोटा प्रोग्राम स्थापित करने का एक अच्छा तरीका क्या है जो उपर्युक्त स्रोत पर संकलक कोड को सीधे आमंत्रित करता है?

+5

आप रोज़लिन समाधान में एक नई परियोजना जोड़ सकते हैं, सही माइक्रोसॉफ्ट के संदर्भ जोड़ सकते हैं। कोडएनालिसिस परियोजनाओं और फिर 'CSharpSyntaxTree.ParseText()' और 'संकलन.इमिट() 'पर कॉल करें। फिर आप अपनी रुचि रखने वाले पार्सिंग या उत्सर्जित कोड के माध्यम से कदम उठा सकते हैं। – JoshVarty

+0

धन्यवाद जोश! मैंने एक उत्तर जोड़ा है जो 'पारसेक्स्ट' प्रदर्शित करता है। @ जोशवर्टी – dharmatech

+1

मैंने कुछ ब्लॉग लेख लिखा है जो @JoshVarty यहां और उसके ब्लॉग लेखों में से एक के आधार पर कुछ हद तक लिखा है। Roslyn internals के साथ खेलने के इच्छुक किसी के लिए यह रुचि हो सकती है। आप भी System.Reflection के लिए NuGet पैकेज के लिए एक संदर्भ जोड़ने की जरूरत है https://renniestechblog.com/information/33-modifying-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

रोसलिन के वर्तमान संस्करण के लिए और विजुअल स्टूडियो 2017 मेटाडेटा, संस्करण = 1.4.2। जब तक मैंने यह निर्धारित नहीं किया कि (और मुझे काफी समय लगेगा) मुझे "एप्लिकेशन ब्रेक मोड में है" मिल रहा था, और कुछ भी करने में असमर्थ था। यह दृश्य स्टूडियो https://developercommunity.visualstudio.com/content/problem/104485/the-application-is-in-break-mode-1.html में एक बग क्या अंत में वास्तविक समस्या के लिए सुराग प्रदान की वजह से हो सकता जब मैं जेनरेट की गई .exe फ़ाइल पर डबल-क्लिक करता था - तब मुझे कंसोल विंडो में एक त्रुटि मिली। – RenniePet

2

आप एक साधारण प्रोग्राम है कि संकलक का आह्वान करना चाहते हैं, तो बस अपने स्टार्टअप परियोजना के रूप में सीएससी उपयोग करने पर विचार। आप प्रोजेक्ट पर डीबग सेटिंग्स से पास (जैसे स्रोत फाइल) पास करने के लिए तर्क निर्दिष्ट कर सकते हैं।

+0

धन्यवाद जेसन! मैं वर्तमान में ऊपर टिप्पणी में जोश द्वारा वर्णित दृष्टिकोण की खोज कर रहा हूं। ऐसा लगता है कि अब तक अच्छा काम कर रहा है। मैंने एक उत्तर जोड़ा है जो उस दृष्टिकोण का वर्णन करता है। – dharmatech

+0

यह विजुअल स्टूडियो डीबगर के तहत Roslyn संकलक का परीक्षण करने के लिए तार्किक तरीके की तरह लगता है। लेकिन csc.exe के लिए बहुत से संभावित तर्क हैं। क्या आपके पास कोई लिंक या सुझाव है कि किस तर्क की आवश्यकता है और कौन से अतिरिक्त तर्क भी उपयोग करने के लिए एक अच्छा विचार हो सकता है? – RenniePet

संबंधित मुद्दे