2010-06-11 17 views
6

मुझे एक प्रोग्राम बनाने की आवश्यकता है जो एक और प्रोग्राम बनाता है लेकिन यद्यपि संकलक नहीं है।एक प्रोग्राम जो एक और प्रोग्राम बनाता है

उदाहरण के लिए,

मैं एक प्रोग्राम है जो उपयोगकर्ता से एक स्ट्रिंग इनपुट स्वीकार करता है लिखते हैं। मान लें कि उपयोगकर्ता "प्लूटो" दर्ज करें। इस प्रोग्राम को तब एक अलग .exe बनाना चाहिए जो निष्पादित होने पर "हैलो प्लूटो" कहता है।

मैं यह कैसे कर सकता हूं? यदि आप सी # और विंडोज फॉर्म में उदाहरण दे सकते हैं, तो यह बेहतर है।

धन्यवाद।

+5

क्या आप हमें दिखा सकते हैं कि आपने अभी तक इस होमवर्क असाइनमेंट पर क्या किया है? – 48klocs

+4

कोड-इट-फॉर-मेरे प्रश्न की तरह बहुत कुछ लगता है ... – Dykam

+7

मैं "यह होमवर्क नहीं है" रखना चाहता था, लेकिन मैंने सोचा कि आप लोग मुझे संदेह का लाभ देंगे। मैं पहले से ही 27 साल का हूँ। यह "मेरे लिए कोड" प्रश्न नहीं है। जिस समस्या का मैं सामना करता हूं वह वास्तव में बहुत बड़ा है, लेकिन मैं समस्या को ऊपर दिए गए सरल प्रश्न को कम करता हूं। – zaidwaqi

उत्तर

14

मूल रूप से एक कंपाइलर है - केवल एक विशेष रूप से सरल भाषा के लिए।

यदि आप सी # में अंतिम कार्यक्रम व्यक्त कर सकते हैं, तो सबसे आसान समाधान शायद CSharpCodeProvider का उपयोग करना है। स्निपी के लिए मैं यही करता हूं, गहराई में सी # के लिए आसानी से कोड स्निपेट चलाने में मदद करने के लिए एक छोटा सा टूल। स्निपी का स्रोत कोड on the C# in Depth web site है और आप यह बता सकते हैं कि आप क्या कर सकते हैं - मूल रूप से आप इसे स्मृति में बनाने के बजाय फ़ाइल में निष्पादन योग्य लिखना चाहते हैं।

वैकल्पिक रूप से, MSDN docs पर देखें जो एक निष्पादन योग्य उत्पन्न करने वाला उदाहरण है।

+0

@Downvoters: एक कारण देने की देखभाल? –

+0

बस इसके लिए अपरिवर्तित। यदि आप सामने वाले पृष्ठ को देखते हैं, तो कोई भी जो कुछ भी देखता है उसे कम कर देता है। – Femaref

+2

कुछ सब कुछ downvotes। प्रश्न सूची देखें। बहुत से अच्छे प्रश्न नीचे दिए गए हैं। कृपया उस बॉट को रोको! स्निपी के लिए –

11

कक्षाएं आप देख रहे हैं Microsoft.CSharp नाम स्थान में हैं

CSharpCodeProvider codeProvider = new CSharpCodeProvider(); 
ICodeCompiler icc = codeProvider.CreateCompiler(); 
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters(); 
parameters.GenerateExecutable = true; 
parameters.OutputAssembly = Output; 
CompilerResults results = icc.CompileAssemblyFromSource(parameters,SourceString); 

(microsoft support गूगल का उपयोग करके पाया से - कम से कम 20 सेकंड ले रही है)

+3

डाउनवोट के लिए कारण देने का ख्याल रखते हैं? – Femaref

+0

उचित उत्तरों को कम करने वाले लोग मुझे उन डाउनवॉटर को कम करना चाहते हैं। – Dykam

+0

कृपया Google के बारे में उत्तर में संरक्षक पाठ का उपयोग न करें। Stackoverflow.com का पूरा बिंदु Google का उपयोग नहीं करना है और यहां कोडिंग संदर्भ है। अन्यथा हम सभी Google का उपयोग क्यों नहीं करते? –

3

अस्थायी तौर पर इस आप भी इस सोचा हासिल कर सकते हैं वह का उपयोग सिस्टम में चीजों का। रिफ्लेक्शन। नेमस्पेस दर्ज करें और मेरा मानना ​​है कि LINQ अभिव्यक्ति पेड़ों के उपयोग के माध्यम से एक विधि के कार्यान्वयन को प्रदान करना संभव है। किस तरह की साफ है:

var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("TestAssembly"), AssemblyBuilderAccess.RunAndSave); 
var mod = assembly.DefineDynamicModule("TestModule"); 
var type = mod.DefineType("TestType"); 
var method = type.DefineMethod("Increment", MethodAttributes.Public, typeof(int), Type.EmptyTypes); 
Expression<Func<int, int>> inc = (a) => a + 1; // this is cool 
inc.CompileToMethod(method); 

यह एक सा पहली बार में कठिन लग सकता है, लेकिन यह वास्तव में शांत सामान है, और आप संकलक मुश्किल सामान, विधि कार्यान्वयन उत्पन्न करते हैं। लेकिन आप वास्तव में इस तरह के फ़ील्ड नहीं बना सकते हैं, जिसके लिए कुछ आईएल की आवश्यकता होगी। जो बहुत मजेदार है लेकिन वास्तव में कठिन काम है।

अस्वीकरण:

मैं ऊपर कोड को चलाने के लिए प्रयास नहीं किया है। लेकिन मुझे पता है कि यह ऐसा कुछ चला जाता है, यह थोड़ी देर हो गया है क्योंकि मैंने ऐसा कुछ किया है।

0

प्रतिबिंब का उपयोग करें। प्रवेश करें।

http://msdn.microsoft.com/en-us/library/8ffc3x75.aspx

http://www.codeproject.com/KB/cs/DynamicCodeGeneration2.aspx

कैसे एक HelloWorld.exe Reflection.Emit का उपयोग कर निर्माण करने के लिए (यह कोड के आधे पृष्ठ की तुलना में कम है): http://blogs.msdn.com/b/joelpob/archive/2004/01/21/61411.aspx

0

होगा करने के लिए सबसे आसान काम वास्तव में एक छोटा सा सरल प्रोग्राम बनाएं जो पहले से संसाधन पढ़ता है और प्रिंट करता है। फिर आपके एप्लिकेशन को केवल डिस्क पर उस प्रोग्राम बाइनरी को रखने की आवश्यकता है और स्ट्रिंग को बदलने के लिए UpdateResource फ़ंक्शन को कॉल करें। .NET में संसाधन समर्थन भी है, लेकिन मुझे किसी भी फ़ंक्शन के बारे में पता नहीं है जो सीधे अद्यतन संसाधन से मेल खाता है।

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