2008-08-07 12 views
15

संकलन एस्सेप्लसफ्रॉमडॉमसे अधिक तेज़ संकलनअनुस्क्रिप्ट्सप्रोसोर्स?सीएसएचआरपीकोडप्रोवाइडर संकलन प्रदर्शन

यह होना चाहिए क्योंकि यह संभावित रूप से कंपाइलर फ्रंट-एंड को बाईपास करता है।

उत्तर

7

CompileAssemblyFromDom एक .cs फ़ाइल में संकलित करता है जो तब सामान्य सी # कंपाइलर के माध्यम से चलाया जाता है।

उदाहरण:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.CSharp; 
using System.CodeDom; 
using System.IO; 
using System.CodeDom.Compiler; 
using System.Reflection; 

namespace CodeDomQuestion 
{ 
    class Program 
    { 

     private static void Main(string[] args) 
     { 
      Program p = new Program(); 
      p.dotest("C:\\fs.exe"); 
     } 

     public void dotest(string outputname) 
     { 
      CSharpCodeProvider cscProvider = new CSharpCodeProvider(); 
      CompilerParameters cp = new CompilerParameters(); 
      cp.MainClass = null; 
      cp.GenerateExecutable = true; 
      cp.OutputAssembly = outputname; 

      CodeNamespace ns = new CodeNamespace("StackOverflowd"); 

      CodeTypeDeclaration type = new CodeTypeDeclaration(); 
      type.IsClass = true; 
      type.Name = "MainClass"; 
      type.TypeAttributes = TypeAttributes.Public; 

      ns.Types.Add(type); 

      CodeMemberMethod cmm = new CodeMemberMethod(); 
      cmm.Attributes = MemberAttributes.Static; 
      cmm.Name = "Main"; 
      cmm.Statements.Add(new CodeSnippetExpression("System.Console.WriteLine('f'zxcvv)")); 
      type.Members.Add(cmm); 

      CodeCompileUnit ccu = new CodeCompileUnit(); 
      ccu.Namespaces.Add(ns); 

      CompilerResults results = cscProvider.CompileAssemblyFromDom(cp, ccu); 

      foreach (CompilerError err in results.Errors) 
       Console.WriteLine(err.ErrorText + " - " + err.FileName + ":" + err.Line); 

      Console.WriteLine(); 
     } 
    } 
} 

जो एक (अब अस्तित्वहीन) अस्थायी फ़ाइल में त्रुटियां दिखाता है:

) की उम्मीद - c: \ दस्तावेज़ और सेटिंग्स \ याकूब \ Local Settings \ Temp \ x59n9yb- .0.cs: 17

; अपेक्षित - सी: \ दस्तावेज़ और सेटिंग्स \ jacob \ स्थानीय सेटिंग्स \ Temp \ x59n9yb-.0.cs: 17

अमान्य अभिव्यक्ति शब्द ')' - c: \ दस्तावेज़ और सेटिंग्स \ jacob \ स्थानीय सेटिंग्स \ Tem p \ x59n9yb-.0.cs: 17

तो मुझे लगता है कि जवाब है "नहीं"

+0

बिल्कुल सही, निराशाजनक यद्यपि। कोडडॉम को सी # टेक्स्ट में परिवर्तित किया गया है, जो एक अस्थायी फ़ाइल में सहेजा गया है, और फिर सी # कंपाइलर (जिसे सी ++ में विकसित किया गया है) कहा जाता है। मुझे नहीं पता कि यह मोनो का मामला है, लेकिन दुख की बात है कि कोडडॉम वास्तव में सी # लिखने से धीमा है। –

+0

माना जाता है कि csc.exe को सी # में फिर से लिखा जा रहा है, इसलिए भविष्य में एक प्रबंधित तरीका हो सकता है जो आपको सीधे एएसटी को कंपाइलर को पास करने देता है। हालांकि, जैसा कि .NET 3.5 अभी खड़ा है, वर्तमान में आईएल असेंबली या बाइटकोड को उत्सर्जित करने के अलावा कंपाइलर फ्रंटएंड को बाईपास करने का कोई तरीका नहीं है। –

0

मैंने पहले अंतिम कंपाइलर कॉल खोजने की कोशिश की है और मैंने छोड़ दिया है। मेरे धैर्य के लिए इंटरफेस और आभासी कक्षाओं की कई परतें हैं।

मुझे नहीं लगता कि कंपाइलर का स्रोत पाठक भाग एक डोम पेड़ के साथ समाप्त होता है, लेकिन सहजता से मैं आपके साथ सहमत हूं। डीओएम को आईएल में बदलने के लिए जरूरी काम सी # स्रोत कोड पढ़ने से बहुत कम होना चाहिए।

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