2008-08-01 11 views
61

मेरे पास सी # में एक छोटा सा गेम लिखा गया है। यह बैक एंड के रूप में डेटाबेस का उपयोग करता है। यह trading card game है, और मैं कार्ड के फ़ंक्शन को एक स्क्रिप्ट के रूप में कार्यान्वित करना चाहता था।.NET अनुप्रयोगों को स्क्रिप्टिंग कार्यक्षमता जोड़ना

मेरा मतलब यह है कि मेरे पास अनिवार्य रूप से एक इंटरफेस है, ICard, जो एक कार्ड क्लास लागू करता है (public class Card056 : ICard) और जिसमें गेम द्वारा कहा जाता है।

अब, चीज़ को बनाए रखने योग्य/संशोधित करने के लिए, मैं प्रत्येक कार्ड के लिए डेटाबेस में स्रोत कोड के रूप में कक्षा रखना चाहता हूं और अनिवार्य रूप से इसे पहले उपयोग पर संकलित करना चाहता हूं। इसलिए जब मुझे कार्ड जोड़ने/बदलने की ज़रूरत है, तो मैं इसे डेटाबेस में जोड़ दूंगा और किसी भी असेंबली परिनियोजन की आवश्यकता के बिना अपने आवेदन को ताज़ा करने के लिए कहूंगा (विशेष रूप से जब हम प्रति कार्ड 1 असेंबली के बारे में बात करेंगे जिसका अर्थ है सैकड़ों असेंबली) ।

क्या यह संभव है? एक स्रोत फ़ाइल से एक वर्ग रजिस्टर और फिर इसे का दृष्टांत, आदि

ICard Cards[current] = new MyGame.CardLibrary.Card056(); 
Cards[current].OnEnterPlay(ref currentGameState); 

भाषा सी #, लेकिन अतिरिक्त बोनस है, तो यह किसी भी .NET भाषा में स्क्रिप्ट लिखने के लिए संभव है।

+1

यह मजाकिया है, मैं और एक दोस्त सी # में एक व्यापार कार्ड गेम लिखने की सोच रहे थे, मान लीजिए कि आपके पास अभी भी इसका स्रोत नहीं है? इस पर आप किससे संपर्क करेंगे इस पर रूचि है। – mattytommo

+0

@mattytommo नहीं, कुछ भी नहीं बचा है, यह वास्तव में शुरुआती चरणों में था और अनिवार्य रूप से बस ऊपर उल्लिखित काम कर रहा था। आजकल, मैं सी # संकलन करने के लिए रोज़लिन में देखता हूं: http://blogs.msdn.com/b/csharpfaq/archive/2011/10/19/introducing-the-microsoft-roslyn-ctp.aspx - वैकल्पिक रूप से, जावास्क्रिप्ट का उपयोग कर जिंट - http://jint.codeplex.com/ –

+0

आह धन्यवाद, लेकिन मैं स्क्रिप्टिंग इंजन के विरोध में, ट्रेडिंग कार्ड गेम के कार्यान्वयन और आपके द्वारा उपयोग की जाने वाली संरचना के कार्यान्वयन के लिए और अधिक देख रहा था। वैसे भी धन्यवाद :) – mattytommo

उत्तर

36

Oleg Shilo's C# Script solution (at The Code Project) वास्तव में आपके आवेदन में स्क्रिप्ट क्षमताओं को प्रदान करने के लिए एक महान परिचय है।

एक अलग दृष्टिकोण ऐसी भाषा पर विचार करना होगा जो विशेष रूप से स्क्रिप्टिंग के लिए बनाया गया है, जैसे IronRuby, IronPython, या Lua

IronPython और IronRuby दोनों उपलब्ध आज कर रहे हैं।

आयरनपीथन को एम्बेड करने के लिए मार्गदर्शिका के लिए How to embed IronPython script support in your existing app in 10 easy steps पढ़ें।

लुआ आमतौर पर खेलों में इस्तेमाल एक पटकथा भाषा है। .NET के लिए एक लूआ कंपाइलर है, जो कोडप्लेक्स से उपलब्ध है - http://www.codeplex.com/Nua

यदि आप .NET में कंपाइलर बनाने के बारे में जानना चाहते हैं तो यह कोडबेस एक महान पढ़ा गया है।

PowerShell को आजमाने के लिए एक अलग कोण पूरी तरह से है।एप्लिकेशन में पावरशेल को एम्बेड करने के कई उदाहरण हैं - यहां विषय पर एक संपूर्ण परियोजना है: Powershell Tunnel

+0

वैसे, मैंने इसे स्वीकार किए गए उत्तर के रूप में चुना है क्योंकि मैं चाहता था फिर भी पाइथन और आयरनपीथन पर लू, इसलिए आयरनपीथन दृष्टिकोण * मुझे * के लिए सबसे अच्छा काम करता है। –

+0

लुआइंटरफेस एक लुआ दुभाषिया है जो शानदार काम करता है। – RCIX

+0

मैंने नवंबर 09 में वर्कफ़्लो सिस्टम में सी # स्क्रिप्ट लागू की। यह हमारे लिए वास्तव में अच्छा प्रदर्शन किया है। –

4

हां, मैंने इसके बारे में सोचा, लेकिन मुझे जल्द ही पता चला कि एक और डोमेन-विशिष्ट-भाषा (डीएसएल) थोड़ा अधिक होगा।

मूलतः, वे संभवतः अप्रत्याशित तरीके से मेरी gamestate के साथ बातचीत करने की जरूरत है। उदाहरण के लिए, एक कार्ड का नियम हो सकता है "जब यह कार्ड खेलते हैं, तो आपके सभी मरे हुए मिनियन उड़ान दुश्मनों के खिलाफ +3 हमले प्राप्त करते हैं, सिवाय इसके कि दुश्मन को आशीर्वाद दिया जाता है"। चूंकि ट्रेडिंग कार्ड गेम बारी-बारी से चलते हैं, गेमस्टेट प्रबंधक ऑनस्टेजएक्स कार्यक्रमों को फायर करेगा और कार्ड को अन्य कार्ड या गेमस्टेट को कार्ड की जरूरतों के अनुसार संशोधित करने देगा।

यदि मैं एक डीएसएल बनाने की कोशिश करता हूं, तो मुझे एक बड़े फीचर सेट को लागू करना होगा और संभवतः इसे लगातार अद्यतन करना होगा, जो वास्तव में इसे हटाने के बिना रखरखाव के काम को दूसरे भाग में बदल देता है।

यही कारण है कि मैं एक "असली" .NET भाषा के साथ रहना चाहता था, अनिवार्य रूप से इस घटना को आग लगाने में सक्षम होना चाहिए और कार्ड को किसी भी तरह से (कोड एक्सेस सुरक्षा की सीमाओं के भीतर) गैमेस्टेट में हेरफेर करने दें।

+0

(इसे ध्वजांकित करने की कोई आवश्यकता नहीं है, जबकि यह एक टिप्पणी/उत्तर अपडेट होना चाहिए, लेकिन विकल्पों में से पहले दादाजी है) – Will

7

आप इसके लिए IronRuby का उपयोग करने में सक्षम हो सकते हैं।

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

यदि आप वास्तव में रन-टाइम पर संकलन करना चाहते हैं तो आप CodeDOM का उपयोग कर सकते हैं, तो आप गतिशील असेंबली को लोड करने के लिए प्रतिबिंब का उपयोग कर सकते हैं। MSDN article which might help

5

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

6

यदि आप डीएलआर का उपयोग नहीं करना चाहते हैं तो आप use Boo (which has an interpreter) पर जा सकते हैं या आप the Script.NET (S#) project on CodePlex पर विचार कर सकते हैं। बू समाधान के साथ आप संकलित स्क्रिप्ट के बीच या दुभाषिया का उपयोग कर सकते हैं, और बू एक अच्छी पटकथा भाषा बनाता है, इसमें एक लचीली वाक्यविन्यास और खुली कंपाइलर आर्किटेक्चर के माध्यम से एक एक्स्टेंसिबल भाषा है। हालांकि, Script.NET भी अच्छा लग रहा है, और आप आसानी से उस भाषा को और साथ ही साथ एक ओपन सोर्स प्रोजेक्ट भी बढ़ा सकते हैं और एक बहुत ही अनुकूल कंपाइलर जेनरेटर (Irony.net) का उपयोग कर सकते हैं।

4

मेरा विभाजन जो मुख्य अनुप्रयोग बेचता है वह क्लाइंट अनुकूलन प्रदान करने के लिए कुछ समान है (जिसका अर्थ है कि मैं कोई स्रोत पोस्ट नहीं कर सकता)। हमारे पास एक सी # एप्लिकेशन है जो गतिशील वीबी.NET स्क्रिप्ट लोड करता है (हालांकि किसी भी .NET भाषा को आसानी से समर्थित किया जा सकता है - वीबी चुना गया था क्योंकि अनुकूलन टीम एएसपी पृष्ठभूमि से आई थी)।

.NET के कोडडॉम का उपयोग करके हम वीबी CodeDomProvider का उपयोग करते हुए डेटाबेस से स्क्रिप्ट संकलित करते हैं (परेशान यह .NET 2 पर डिफ़ॉल्ट है, यदि आप 3.5 सुविधाओं का समर्थन करना चाहते हैं तो आपको "कंपाइलरवर्सन" = "v3" के साथ शब्दकोश को पास करने की आवश्यकता है। 5 "इसके निर्माता के लिए)। इसे संकलित करने के लिए CodeDomProvider.CompileAssemblyFromSource विधि का उपयोग करें (आप इसे केवल स्मृति में संकलित करने के लिए मजबूर करने के लिए सेटिंग्स को पास कर सकते हैं।

इसके परिणामस्वरूप स्मृति में सैकड़ों असेंबली हो सकती हैं, लेकिन आप सभी गतिशील कक्षाओं के कोड को एक ही असेंबली में डाल सकते हैं , और किसी भी बदलाव के दौरान पूरी तरह से पुन: संकलित करें। इसका लाभ यह है कि जब आप परीक्षण कर रहे हों, तो PDB के साथ डिस्क पर संकलन करने के लिए आप एक फ्लैग जोड़ सकते हैं, जिससे आप गतिशील कोड के माध्यम से डीबग कर सकते हैं।

5

मैं चाहता था LuaInterface का उपयोग करने का सुझाव दें क्योंकि यह पूरी तरह से लुआ लागू किया गया है, जहां ऐसा लगता है कि नुआ पूर्ण नहीं है और संभवतः कुछ बहुत उपयोगी कार्यक्षमता (कोरआउट, आदि) को लागू नहीं करता है।

यदि आप कुछ बाहरी प्रीपेक्टेड लुआ मॉड्यूल का उपयोग करना चाहते हैं, तो मैं 2.x श्रृंखला के विपरीत 1.5.x की लाइनों के साथ कुछ का उपयोग करने का सुझाव दूंगा जो पूरी तरह से प्रबंधित कोड बनाता है और आवश्यक सी एपीआई का पर्दाफाश नहीं कर सकता है।

3

.NET (5.0?) के अगले संस्करण में "एक सेवा के रूप में कंपाइलर" खोलने के बारे में बहुत सी बात हुई है जो प्रत्यक्ष स्क्रिप्ट मूल्यांकन जैसी चीजों को संभव बना देगा।

+0

मुझे विश्वास है कि यह Roslyn को संदर्भित करता है? http://en.wikipedia.org/wiki/Microsoft_Roslyn –

+2

हां। हालांकि Roslyn अभी भी क्षितिज पर है, [Mono.CSharp (NuGet पर उपलब्ध)] (http://blog.davidebbo.com/2012/02/quick-fun-with-monos-csharp-compiler-as.html) पैक सभी समान कार्यक्षमता। –

+0

विकल्पों को प्रासंगिक रखने के लिए अद्यतन जोड़ना: .NET कंपाइलर प्लेटफ़ॉर्म ("Roslyn") उपलब्ध है। तो यह उल्लेख किए गए सभी अन्य लोगों के लिए एक व्यवहार्य विकल्प है। https://github.com/dotnet/roslyn। – Riv

5

मैं नेट   1.1 एप्लिकेशन के लिए LuaInterface1.3 + Lua 5.0 का उपयोग कर रहा हूं।

बू के साथ समस्या यह है कि हर बार जब आप फ्लाई पर अपना कोड पार्स/संकलित/eval करते हैं, तो यह बू कक्षाओं का एक सेट बनाता है ताकि आपको मेमोरी लीक मिल जाए।

दूसरी ओर लूआ ऐसा नहीं करता है, इसलिए यह बहुत ही स्थिर है और अद्भुत काम करता है (मैं सी # से लुआ और पीछे की तरफ से ऑब्जेक्ट पास कर सकता हूं)।

अभी तक मैंने इसे अभी तक प्रोड में नहीं रखा है, लेकिन यह बहुत ही आशाजनक प्रतीत होता है।

मेरे पास LuaInterface + Lua 5.0 का उपयोग कर प्रोड में मेमोरी लीक समस्याएं थीं, इसलिए मैंने लुआ 5.2 का उपयोग किया और सीधे डी # के साथ सी # में लिंक किया। मेमोरी लीक LuaInterface लाइब्रेरी के अंदर थे।

लुआ 5.2: http://luabinaries.sourceforge.net और http://sourceforge.net/projects/luabinaries/files/5.2/Windows%20Libraries/Dynamic/lua-5.2_Win32_dll7_lib.zip/download

एक बार मैं ऐसा किया, मेरे सभी मेमोरी लीक जा चुके थे और आवेदन बहुत स्थिर था।