2012-07-31 29 views
5

के रूप में लोड करें क्या कक्षा के रूप में .txt फ़ाइल लोड करने का कोई तरीका है, जिसका मेरा मुख्य प्रोग्राम तब से फ़ंक्शन कॉल कर सकता है? मैं मूल रूप से अपने सरल ऐप में आधुनिक समर्थन जोड़ने की कोशिश कर रहा हूं, जहां उपयोगकर्ता प्रत्येक फ़ाइल से विकल्पों का चयन कर सकता है। फ़ाइल मुख्य कार्यक्रम में बुलाए जाने वाले वॉयड्स (फ़ंक्शंस) के समूह के साथ एक समान (लेकिन समान नहीं) प्रारूप का पालन करती है।सी # - एक वर्ग फ़ाइल को

मैं यह कैसे कर सकता हूं? क्या यह करना संभव है (संभवतः, मेरे अपने प्रश्न का उत्तर नहीं दे रहा है?), इस पर विचार करते हुए इसे शेष कार्यक्रम के साथ संकलित नहीं किया जाएगा?

धन्यवाद!

+0

यह संभव है, लेकिन आपको सी # कंपाइलर का आह्वान करना होगा .. गैर-तुच्छ। अपने मोड को डीएलएस में संकलित करने की आवश्यकता होती है, जिसे आप लोड कर सकते हैं और प्रतिबिंब के साथ कॉल कर सकते हैं। – Blorgbeard

+0

शायद Roslyn – Prescott

उत्तर

6

मुझे इस सवाल का जवाब देखें: Compile a C# Array at runtime and use it in code?

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

  • अपलोड की गई फ़ाइल
  • प्राप्त फ़ाइल
  • पर किसी भी जरूरत को पूरा करें सत्यापन किसी भी संकलक/संरचना त्रुटियों के साथ CodeDom
  • डील में एक स्ट्रिंग के रूप में फ़ाइल पढ़ें
  • Linq अभिव्यक्ति का उपयोग करते हुए सहायक तरीकों बनाएं पेड़ या गतिशील विधियों ताकि नए वर्ग और मौजूदा कोड के बीच संबंध एक संकलित वस्तु के साथ ब्रिज किया गया हो (अन्यथा, सभी नए तरीकों को प्रतिबिंब का उपयोग करके बुलाया जाना चाहिए)
:
var csc = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v4.0" } }); 
var cp = new CompilerParameters() { 
    GenerateExecutable = false, 
    OutputAssembly = outputAssemblyName, 
    GenerateInMemory = true 
}; 

cp.ReferencedAssemblies.Add("mscorlib.dll"); 
cp.ReferencedAssemblies.Add("System.dll"); 

StringBuilder sb = new StringBuilder(); 

// The string can contain any valid c# code 

sb.Append("namespace Foo{"); 
sb.Append("using System;"); 
sb.Append("public static class MyClass{"); 
sb.Append("}}"); 

// "results" will usually contain very detailed error messages 
var results = csc.CompileAssemblyFromSource(cp, sb.ToString()); 

इसके अलावा, इस विषय देखें। डीएलआर के साथ IronPython आपकी आवश्यकताओं के लिए उपयुक्त हो सकता है।

+0

यह बात है - मैं जरूरी नहीं है कि मैं इसे संकलित करना चाहता हूं, मुझे बस इसे एक स्क्रिप्ट के रूप में चलाने की आवश्यकता है। – Scott

+1

मैं देखता हूं। एफवाईआई, लिपियों पर भी, लिपियों को संकलित किया जाता है। आपकी प्रदर्शन आवश्यकताओं के आधार पर, गतिशील संकलन उपयुक्त हो सकता है, हालांकि सी # संकलन शायद फ्लाई ऑपरेशंस के लिए कम अनुकूलित है। –

+0

यह वास्तव में बहुत अच्छा लग रहा है, मैं इसे जोड़ दूंगा! धन्यवाद! – Scott

1

एक रूपरेखा है कि प्लगइन्स

हैंडल का प्रयोग करें प्रबंधित तानाना फ्रेमवर्क सिर्फ तुम क्या

http://mef.codeplex.com/

प्रबंधित तानाना फ्रेमवर्क (MEF) की तलाश कर रहे है एक संरचना परत है .NET के लिए जो बड़े अनुप्रयोगों की लचीलापन, रखरखाव और परीक्षण क्षमता में सुधार करता है। एमईएफ का उपयोग थर्ड-पार्टी प्लगइन एक्स्टेंसिबिलिटी के लिए किया जा सकता है, या यह नियमित अनुप्रयोगों के लिए एक कमजोर-युग्मित प्लग-इन आर्किटेक्चर के लाभ ला सकता है।

एमईएफ आपके आवेदन में प्लगइन का समर्थन करने के लिए एक अच्छी तरह से परिभाषित आर्किटेक्चर प्रदान करता है।

DLL बनाम पाठ (स्रोत कोड)

प्लगइन डेवलपर एक DLL प्लगइन कोड युक्त प्रदान करने के लिए उम्मीद है। हालांकि, यदि आवश्यक हो, तो आप Roslyn का उपयोग कर स्रोत कोड को उनके लिए डीएलएल में संकलित कर सकते हैं। ध्यान रखें कि यदि आप प्लगइन स्रोत कोड प्राप्त करने का समर्थन करना चाहते हैं, तो आपको उपयोगकर्ता को कंपाइलर त्रुटियों से निपटने और प्लगइन को अपने ढांचे के भीतर डिबग करने में सहायता करने के लिए समर्थन भी प्रदान करना होगा। डीएलएल प्रदान करने के लिए उन्हें आवश्यकता हो सकती है।

+1

का उपयोग करने के लिए देखना होगा क्या यह एक वर्ग के रूप में .txt फ़ाइल के साथ काम करेगा? मुझे लगता है कि उसे अनिवार्य रूप से इसे संकलित करने की आवश्यकता होगी – Prescott

+0

@ प्रिस्कॉट: उस बिंदु के पते पर मेरा उत्तर अपडेट किया गया। –

+0

इस के बारे में कोई अद्यतन? –

3

आप एक टेक्स्ट फ़ाइल लोड कर सकते हैं और फिर कुछ कंपाइलर-ए-ए-सर्विस (या तो Microsoft's pre-release Roslyn project या Mono.CSharp) का उपयोग कर सकते हैं। फिर आप संकलित आउटपुट ले सकते हैं और उन्हें अपने प्रोग्राम में चला सकते हैं।

यदि आपके उपयोगकर्ता को एक असम्बद्ध स्रोत फ़ाइल के बजाय एक संकलित असेंबली देने के लिए संभव है, तो आपको Managed Extensibility Framework या Mono.Addins पर विचार करना चाहिए।

दूसरा दृष्टिकोण (एक्सटेंशन असेंबली) कम से कम दो कारणों से मेरे लिए बेहतर प्रतीत होता है: 1) आपका उपयोगकर्ता जो भी विकास वातावरण का उपयोग कर सकता है, वे यह सुनिश्चित करना चाहते हैं कि उनका कोड आपके ऊपर सौंपने से पहले सही ढंग से संकलित हो, और 2) इनपुट को प्रमाणित करने और असफलताओं को संभालने के लिए आपके पास कम काम है।

+0

धन्यवाद! मैं रोज़लिन की जांच करूंगा, इसके बारे में कुछ टिप्पणियां बात कर रही हैं। – Scott

+2

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