.NET अनुप्रयोगों में स्क्रिप्टिंग कार्यक्षमता जोड़ना

मेरे पास सी # में एक छोटा सा गेम लिखा गया है। यह बैक एंड के रूप में डेटाबेस का उपयोग करता है। आईटी इस एक ट्रेडिंग कार्ड गेम , और मैं एक स्क्रिप्ट के रूप में कार्ड के फ़ंक्शन को कार्यान्वित करना चाहता था।

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

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

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

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

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

0
जोड़ा संपादित
विचारों: 1
@mattytommo नहीं, कुछ भी नहीं बचा है, यह वास्तव में शुरुआती चरणों में था और अनिवार्य रूप से बस ऊपर उल्लिखित काम कर रहा था। आजकल, मैं सी # संकलन करने के लिए रोज़लिन में देखता हूं: blogs.msdn.com/b/csharpfaq/archive/2011/10/19/… - वैकल्पिक रूप से, जावास्क्रिप्ट का उपयोग कर जावास्क्रिप्ट - jint.codeplex.com
जोड़ा लेखक Michael Stum, स्रोत
यह मजाकिया है, मैं और एक दोस्त कुछ समय पहले सी # में एक ट्रेडिंग कार्ड गेम लिखने की सोच रहे थे, मान लीजिए कि आपके पास अभी भी इसका स्रोत नहीं है? इस पर आप किससे संपर्क करेंगे इस पर रूचि है।
जोड़ा लेखक mattytommo, स्रोत
आह धन्यवाद, लेकिन मैं स्क्रिप्टिंग इंजन के विरोध में, ट्रेडिंग कार्ड गेम के कार्यान्वयन और आपके द्वारा उपयोग की जाने वाली संरचना के कार्यान्वयन के लिए और अधिक देख रहा था। फिर भी धन्यवाद :)
जोड़ा लेखक mattytommo, स्रोत

9 उत्तर

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

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

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

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

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

Oleg Shilo's C# Script solution (at The Code Project) really is a great introduction to providing script abilities in your application.

एक अलग दृष्टिकोण ऐसी भाषा पर विचार करना होगा जो विशेष रूप से स्क्रिप्टिंग के लिए बनाया गया है, जैसे कि IronRuby , < a href = "http://en.wikipedia.org/wiki/IronPython" rel = "noreferrer"> IronPython , या लुआ

आयरनपीथन और आयरनरुबी दोनों आज उपलब्ध हैं।

IronPython को एम्बेड करने के लिए एक गाइड के लिए पढ़ें 10 आसान चरणों में अपने मौजूदा ऐप में आयरनपीथन स्क्रिप्ट समर्थन को कैसे एम्बेड करें

Lua is a scripting language commonly used in games. There is a Lua compiler for .NET, available from CodePlex -- http://www.codeplex.com/Nua

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

A different angle altogether is to try PowerShell. There are numerous examples of embedding PowerShell into an application -- here's a thorough project on the topic: Powershell Tunnel

0
जोड़ा
वैसे, मैंने इसे स्वीकृत उत्तर के रूप में चुना है क्योंकि मैं पाइथन और आयरनपीथन पर भी जाना चाहता था, इसलिए आयरनपीथन दृष्टिकोण me के लिए सबसे अच्छा काम करता है।
जोड़ा लेखक Michael Stum, स्रोत
लुआइंटरफेस एक लुआ दुभाषिया है जो शानदार काम करता है।
जोड़ा लेखक RCIX, स्रोत
मैंने नवंबर 09 में वर्कफ़्लो सिस्टम में सी # स्क्रिप्ट लागू की। यह हमारे लिए वास्तव में अच्छा प्रदर्शन किया है।
जोड़ा लेखक David Robbins, स्रोत

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

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

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

0
जोड़ा

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

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

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

0
जोड़ा

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

0
जोड़ा
हाँ। हालांकि Roslyn अभी भी क्षितिज पर है, Mono.CSharp (NuGet पर उपलब्ध) सभी समान कार्यक्षमता पैक करता है।
जोड़ा लेखक Eric Falsken, स्रोत
विकल्पों को प्रासंगिक रखने के लिए एक अद्यतन जोड़ना: .NET कंपाइलर प्लेटफ़ॉर्म ("Roslyn") उपलब्ध है। तो यह उल्लेख किए गए सभी अन्य लोगों के लिए एक व्यवहार्य विकल्प है। github.com/dotnet/roslyn
जोड़ा लेखक Riv, स्रोत
मेरा मानना ​​है कि यह Roslyn को संदर्भित करता है? en.wikipedia.org/wiki/Microsoft_Roslyn
जोड़ा लेखक Stephen Kennedy, स्रोत

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

0
जोड़ा

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

0
जोड़ा

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

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

0
जोड़ा

I'm using LuaInterface1.3 + Lua 5.0 for a NET 1.1 application.

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

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

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

I did have memory leaks issues in PROD using LuaInterface + Lua 5.0, therefore I used Lua 5.2 and linked directly into C# with DllImport. The memory leaks were inside the LuaInterface library.

Lua 5.2: from http://luabinaries.sourceforge.net and http://sourceforge.net/projects/luabinaries/files/5.2/Windows%20Libraries/Dynamic/lua-5.2_Win32_dll7_lib.zip/download

एक बार मैंने ऐसा करने के बाद, मेरी सभी मेमोरी लीक चली गईं और एप्लिकेशन बहुत स्थिर था।

0
जोड़ा