2010-01-21 11 views
5

में संग्रहीत फ़ंक्शन निष्पादित करें क्या सी # में एक सरल और तेज़ फ़ंक्शन लिखना संभव है जो स्ट्रिंग से मनमाने ढंग से विधियों को निष्पादित करेगा? उदाहरण के लिए, यदि मैंने MyString = "MessageBox.Show (" कुछ संदेश ") सेट किया है और फिर ExecuteString (MyString) को कॉल करें, तो एक संदेश बॉक्स इसमें" कुछ संदेश "के साथ पॉप अप होगा।सी #: स्ट्रिंग वेरिएबल

(मैं शायद उपरोक्त कोड में त्रुटि किसी प्रकार का कर दिया है मैं अभी तक पता नहीं सी #;। मैं मूल्यांकन करने के लिए है कि क्या यह एक विशेष परियोजना के लिए उपयुक्त होगा कोशिश कर रहा हूँ।)

+2

सुनिश्चित नहीं हैं कि अगर यह एक नकली है, लेकिन आप की संभावना एक तरह से सी # में REPL के लिए करने के लिए के लिए देख रहे हैं, और एक अच्छा सवाल ही नहीं है इसके बारे में यहां: http://stackoverflow.com/questions/1038106/ या यहां http://stackoverflow.com/questions/2058715/ जो कुछ विचार/स्रोत कोड प्रदान कर सकता है। –

उत्तर

2

ओह, सी # उस तरह एक गतिशील भाषा नहीं है। आप वास्तव में यह आसानी से नहीं कर सकते हैं, और यदि यह वास्तव में कुछ करने की ज़रूरत है, तो अपनी आवश्यकताओं के अनुरूप, नेट नेट भाषा का उपयोग करने पर विचार करें, जैसे आयरनपीथन या आयरन रूबी।

में आपका सर्वश्रेष्ठ उपलब्ध विकल्प this forum thread शो से, CodeDom नाम स्थान का उपयोग करने के लिए इस सही मायने में जटिल और जघन्य उदाहरण के रूप में है:

using System; 
using System.CodeDom; 
using System.CodeDom.Compiler; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.Drawing; 
using System.Linq; 
using System.Reflection; 
using System.Reflection.Emit; 
using System.Text; 
using System.Windows.Forms; 

namespace TestApp 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     SampleLib.SampleType test = new SampleLib.SampleType(); 

     private void button1_Click(object sender, EventArgs e) 
     { 
      // Dynamically build and call the method 
      label1.Text = test.MyText; 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      StringBuilder DynamicCode = new StringBuilder(); 
      DynamicCode.Append("namespace TestDynamic"); 
      DynamicCode.Append("{"); 
      DynamicCode.Append("public class DynamicCode"); 
      DynamicCode.Append("{"); 
      DynamicCode.Append("public static void EditText(SampleLib.SampleType t)"); 
      DynamicCode.Append("{"); 
      DynamicCode.Append("t.MyText = \"Goodbye!\";"); 
      DynamicCode.Append("}"); 
      DynamicCode.Append("}"); 
      DynamicCode.Append("}"); 

      string CodeString = DynamicCode.ToString(); 

      System.IO.FileInfo fi = new System.IO.FileInfo(Application.ExecutablePath); 
      CodeDomProvider provider = CodeDomProvider.CreateProvider("C#"); 
      CompilerParameters CompileParams = new CompilerParameters(new string[] { fi.DirectoryName + "\\SampleLib.dll" }, 
       fi.DirectoryName + "\\Dynamic.dll"); 
      CompileParams.MainClass = "DynamicCode"; 
      CompileParams.GenerateExecutable = false; 
      //CompileParams.GenerateInMemory = true; 
      CompilerResults r = provider.CompileAssemblyFromSource(CompileParams, new string[] {CodeString}); 
      foreach (CompilerError er in r.Errors) 
      { 
       Console.WriteLine(er.ErrorText); 
      } 
     } 

     private void button3_Click(object sender, EventArgs e) 
     { 
      // Dynamically call assembly 
      System.IO.FileInfo fi = new System.IO.FileInfo(Application.ExecutablePath); 
      Assembly dynAsm = Assembly.LoadFile(fi.DirectoryName + "\\Dynamic.dll"); 
      if (dynAsm != null) 
      { 
       object o = dynAsm.CreateInstance("TestDynamic.DynamicCode", true); 
       Type t = dynAsm.GetType("TestDynamic.DynamicCode"); 
       t.GetMethod("EditText").Invoke(o, new object[]{test}); 
      } 
     } 
    } 
} 
+0

आप वास्तव में कर सकते हैं। मैंने न केवल पोस्ट किया है, बल्कि इसे स्वयं भी किया है। –

+1

मैंने यह नहीं कहा कि यह _possible_ नहीं था, बस यह _easy_ नहीं था। मुझे यकीन नहीं है कि एमएसडीएन उदाहरण का उल्लेख है - जिसमें कोड की एक पंक्ति को "निष्पादित" करने के लिए 100 से अधिक पंक्तियों की आवश्यकता होती है, आपको दिमाग - आसान माना जा सकता है। –

3

आप इस का उपयोग और एक स्ट्रिंग में चलाने के लिए आवश्यक कोड रैप करने के लिए सक्षम होना चाहिए एक समारोह।

अनिवार्य रूप से आप जो कर रहे हैं वह Program.Main स्टाइल फ़ंक्शन में सी # कोड को छोटा सा लपेट रहा है, बुनियादी कार्यक्षमता (शायद आपकी स्वयं की असेंबली सहित) के लिए कुछ असेंबली का संदर्भ देना, फिर संकलित प्रोग्राम को स्मृति में चलाएं।

यह तुलना में आप बस कोड मन आप की एक या दो पंक्तियों चलाने की आवश्यकता होने की संभावना अधिक भूमि के ऊपर का एक सा है।

http://support.microsoft.com/kb/304655

+0

सहमत - सबसे अच्छा विकल्प वास्तव में इस प्रकार के काम को आयरनपीथन या आयरन रूबी को सौंपना है, जहां यह करना बहुत आसान है। –

+0

हाँ, "स्क्रिप्ट कोड" की ऐसी छोटी मात्रा के लिए हल्के स्क्रिप्ट-आधारित विधियों का उपयोग करना बेहतर होगा। –

+0

यदि कोई संदर्भ आवश्यक है, तो रनटाइम वैरिएबल तक पहुंच और लोहे के माध्यम से कोड स्ट्रिंग से होस्ट एप्लिकेशन में कक्षाएं या अन्य डीएलआर भाषाएं बेहतर होती हैं या यदि कोड स्ट्रिंग असेंबली असेंबली से अक्सर बदलती है तो वैसे भी एक अच्छा विकल्प नहीं है मूल्यांकन की आवश्यकता वाले प्रत्येक कोड स्ट्रिंग के लिए असेंबली। – affan

3

क्या के लिए आप देख होना दिखाई देते हैं CS-Script

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