2013-04-20 6 views
7

के लिए एक स्क्रिप्टिंग भाषा के रूप में सी # का उपयोग करना मैंने एक ऐसा एप्लीकेशन विकसित किया है जो कुछ कॉन्फ़िगरेशन और सेटिंग्स के लिए सी # स्क्रिप्ट फ़ाइलों का उपयोग करता है। स्क्रिप्ट फ़ाइल में विभिन्न ऑब्जेक्ट जेनरेट ऑब्जेक्ट्स और उन ऑब्जेक्ट्स पर कुछ फ़ंक्शन शामिल हैं। वर्तमान में, उपयोगकर्ता को किसी तृतीय पक्ष संपादक का उपयोग करके एक .cs फ़ाइल उत्पन्न करना है और इसका उपयोग करने के लिए मेरे प्रोग्राम के पथ की आपूर्ति करना है। इस विधि के साथ नुकसान यह है कि स्क्रिप्ट फ़ाइलों को संपादित करते समय उपयोगकर्ता को ऑटो-पूर्ण और इंटेलिजेंस-एस्क्यू समर्थन की लचीलापन नहीं है।सी # अनुप्रयोग

मैं अपने आवेदन में स्क्रिप्ट संपादन भाग को एम्बेड करना चाहता हूं। मैं एक समृद्ध-पाठ संपादक का उपयोग कर ऐसा कर सकता हूं। लेकिन ऑटो-पूर्ण भाग को कोड करना एक बड़ा दर्द है। क्या कोई तरीका है जिसमें मैं उपयोगकर्ता को इन-प्रोग्राम एडिटर प्रदान कर सकता हूं जो ऑटो-पूर्ण भी करता है ....

प्रोग्राम में गतिशील रूप से एक स्क्रिप्ट को संकलित करने के लिए कोड। एक पार्सर, और प्रतिबिंब:

public String Compile(String inputfilepath) 
    { 

     CompilerResults res = null; 
     CSharpCodeProvider provider = new CSharpCodeProvider(); 
     String errors = ""; 

     if (provider != null) 
     { 
      try 
      { 
       Assembly asb = Assembly.Load("BHEL.PUMPSDAS.Datatypes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=81d3de1e03a5907d"); 
       CompilerParameters options = new CompilerParameters(); 
       options.GenerateExecutable = false; 
       options.OutputAssembly = String.Format(outFileDir + oName); 
       options.GenerateInMemory = false; 
       options.TreatWarningsAsErrors = false; 
       options.ReferencedAssemblies.Add("System.dll"); 
       options.ReferencedAssemblies.Add("System.Core.dll"); 
       options.ReferencedAssemblies.Add("System.Xml.dll"); 
       options.ReferencedAssemblies.Add("System.Xml.dll"); 
       options.ReferencedAssemblies.Add(asb.Location); 
       res = provider.CompileAssemblyFromFile(options, inputfilepath); 
       errors = ""; 
       if (res.Errors.HasErrors) 
       { 
        for (int i = 0; i < res.Errors.Count; i++) 
        { 
         errors += "\n " + i + ". " + res.Errors[i].ErrorText; 
        } 
       } 
      } 

      catch (Exception e) 
      { 
       throw (new Exception("Compilation Failed with Exception!\n" + e.Message + 
        "\n Compilation errors : \n" + errors + "\n")); 
      } 

     } 
     return errors; 
    } 
+0

लुआ, पायथन या पावरस्क्रिप्ट? आप किस स्क्रिप्ट भाषा का उपयोग कर रहे हैं? – David

+1

सी # स्वयं ही मेरी पटकथा भाषा है। मैं अपने प्रोग्राम के भीतर से फ्लाई पर सी # स्क्रिप्ट फ़ाइलों को संकलित करने के लिए कोडडॉम नेमस्पेस का उपयोग कर रहा हूं। –

+0

ओह मेरे भगवान! सी # आपकी लिपि है? क्या आपको यकीन है? – David

उत्तर

2

विशेष रूप से स्वत: पूर्ण के लिए, आप दो प्रणालियों के उपयोग करने की आवश्यकता होगी।

एक पार्सर सिद्धांत में एक बहुत ही सरल अवधारणा है, लेकिन मुझे यकीन है कि एक भाषा के लिए जितना वाक्य सिंटैक्टिक चीनी और सी # के रूप में कई संदर्भ-संवेदनशील कीवर्ड के साथ लिखना आसान नहीं होगा।

चूंकि .NET निहित रूप से प्रतिबिंबित है, और एक प्रतिबिंब ढांचा प्रदान करता है, वह हिस्सा अविश्वसनीय रूप से दर्दनाक नहीं होना चाहिए। प्रतिबिंब आपको ऑब्जेक्ट उन्मुख तत्वों को संकलित करने के लिए अनुमति देता है जिसमें संकलित असेंबली शामिल हैं - और विधानसभाएं स्वयं वस्तुओं के रूप में। उदाहरण के लिए, एक विधि Method ऑब्जेक्ट होगी। आप Type कक्षा के सदस्यों की जांच करके इस प्रणाली में एक झलक ले सकते हैं, जो प्रतिबिंब के लिए एक बुनियादी प्रारंभिक बिंदु प्रदान करते हैं। एक और उपयोगी प्रारंभिक बिंदु Assembly है। MSDN, सामान्य रूप से, एक संरचित प्रारूप में "आधिकारिक" जानकारी का एक धन है।

+0

आपकी विधि उन सिस्टम पर काम करती है जो पहले ही संकलित हैं। मैं जो चाहता हूं वह विजुअल स्टूडियो शैली इंटेलिसेंस है, जो कोड संकलित होने से पहले भी काम करता है। –

+0

जो अनिवार्य रूप से इसका मतलब है कि आप इसे संकलित करते समय संकलित कर रहे हैं। वही विचार आप अभी भी प्रतिबिंब का उपयोग कर सकते हैं; ढांचा जगह में है। आप मूल रूप से एक ऑब्जेक्ट उन्मुख शैल संकलित कर रहे हैं। आपको स्थानीय चर के लिए कुछ कस्टम करने की आवश्यकता होगी, लेकिन यह केवल एक तत्व है। – Zenexer

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