সি # ডেস্কটপ অ্যাপ্লিকেশনটিতে এম্বেড করার জন্য সেরা স্ক্রিপ্টিং ভাষা কোনটি? [বন্ধ]


98

আমরা একটি জটিল সমৃদ্ধ ডেস্কটপ অ্যাপ্লিকেশন লিখছি এবং ফর্ম্যাটগুলির প্রতিবেদন করার ক্ষেত্রে নমনীয়তা সরবরাহ করার প্রয়োজন রয়েছে তাই আমরা ভেবেছিলাম যে আমরা কেবল আমাদের বস্তুর মডেলটিকে স্ক্রিপ্টিং ল্যাঙ্গোজে প্রকাশ করব। সময়টি ছিল যখন ভিবিএ (যা এখনও একটি বিকল্প) বোঝায়, তবে পরিচালিত কোড ডেরিভেটিভ ভিএসটিএ (আমার মনে হয়) লতা শুকিয়ে গেছে বলে মনে হয়।

উইন্ডোজ .NET এ এমবেডেড স্ক্রিপ্টিং ভাষার জন্য এখন সেরা পছন্দটি কী?


এফডব্লিউআইডাব্লু, আমি @ গ্রান্টপিটারের উত্তরে এই পদ্ধতির সাহায্যে শুরু করেছি, আনডোলিংয়ের অনুমতি দেওয়ার জন্য একটি অ্যাপডোমাইন ব্যবহার করেছি, ক্রস-ডোমেন অবজেক্ট লিজ পুনর্নবীকরণ পরিচালনা করেছি, এবং স্যান্ডবক্স সুরক্ষা ব্যবস্থা গ্রহণ করেছি। সংকলিত স্ক্রিপ্ট অ্যাপডোমাইন সীমানা জুড়ে মূল প্রোগ্রামে পদ্ধতিগুলি কল করতে পারে। পরীক্ষাটি এখানে পাওয়া যাবে: github.com/fadden/DynamicScriptSandbox
fadden

উত্তর:


24

আমি আশ্চর্যজনক ফলাফল সহ CSS স্ক্রিপ্ট ব্যবহার করেছি । এটি আমার স্ক্রিপ্টযোগ্য অ্যাপ্লিকেশনগুলিতে বাইন্ডিংগুলি এবং অন্যান্য নিম্ন স্তরের স্টাফগুলি করতে সত্যিই কমেছে।


4
আমি এক বছরেরও বেশি সময় ধরে উত্পাদনে সিএস-স্ক্রিপ্ট ব্যবহার করছি এবং এটি সত্যই দুর্দান্ত পারফর্ম করেছে।
ডেভিড রবিনস

বিটিডব্লিউ - সি # স্ক্রিপ্ট সমর্থন সক্ষম করতে আপনি হয় সি স্ক্রিপ্ট লাইব্রেরির ভিতরে ভিতরে সংহত করতে পারেন, বা সি স্ক্রিপ্ট সংকলন নিজেই তৈরি করতে পারেন। আমি এখানে আমার নিজের প্রকল্পে অনুরূপ লাইটওয়েট সি # স্ক্রিপ্ট কম্পাইলার করেছ: sourceforge.net/p/syncproj/code/HEAD/tree/CsScript.cs সি # স্ক্রিপ্ট সংকলন নিজেই (উদাহরণস্বরূপ .Lua তুলনায় চেয়ে) ধীর বিট, তোলে প্রয়োজনে অতিরিক্ত সংকলন পদক্ষেপ এড়াতে বোধ।
টারমোপিকারো

114

ব্যক্তিগতভাবে, আমি স্ক্রিপ্টিং ভাষা হিসাবে সি # ব্যবহার করব। .NET ফ্রেমওয়ার্ক (এবং মনো, ম্যাথিউ স্কারলে ধন্যবাদ) প্রকৃতপক্ষে ফ্রেমওয়ার্কটিতে প্রতিটি নেট নেটওয়ার্কের সংকলকগুলি অন্তর্ভুক্ত করে।

মূলত, এই সিস্টেমটি প্রয়োগের 2 অংশ রয়েছে।

  1. ব্যবহারকারীকে কোডটি সংকলন করার অনুমতি দিন এটি তুলনামূলকভাবে সহজ, এবং কোডের কয়েকটি লাইনগুলিতেই করা যেতে পারে (যদিও আপনি একটি ত্রুটি সংলাপ যুক্ত করতে চান, সম্ভবত এটি কতটা ব্যবহারযোগ্য তার উপর নির্ভর করে কোডের আরও কয়েক ডজন লাইন হতে পারে) আপনি এটি হতে চান)।

  2. সংকলিত সমাবেশের মধ্যে থাকা ক্লাস তৈরি এবং ব্যবহার করুন এটি পূর্ববর্তী ধাপের চেয়ে কিছুটা বেশি কঠিন (প্রতিচ্ছবিটির একটি ছোট্ট বিট প্রয়োজন)। মূলত, আপনার কেবল সংকলিত সমাবেশটিকে প্রোগ্রামের জন্য "প্লাগ-ইন" ​​হিসাবে বিবেচনা করা উচিত। আপনি সি # তে গুগল (গুগল আপনার বন্ধু) তে প্লাগ-ইন সিস্টেম তৈরি করতে পারেন এমন বিভিন্ন উপায়ে বেশ কয়েকটি টিউটোরিয়াল রয়েছে।

আপনি কীভাবে এই সিস্টেমটি প্রয়োগ করতে পারবেন তা প্রদর্শনের জন্য আমি একটি "দ্রুত" অ্যাপ্লিকেশন প্রয়োগ করেছি (এতে 2 টি কার্যনির্বাহী স্ক্রিপ্ট রয়েছে!)। এটি অ্যাপ্লিকেশনটির সম্পূর্ণ কোড, কেবল একটি নতুন একটি তৈরি করুন এবং কোডটিকে "program.cs" ফাইলটিতে পেস্ট করুন। এই মুহুর্তে আমি অবশ্যই কোডটি যে বড় আকারের পেস্ট করতে চলেছি তার জন্য অবশ্যই ক্ষমা চাইতে হবে (এটি এত বড় হওয়ার জন্য আমার ইচ্ছা ছিল না, তবে আমার মন্তব্যে কিছুটা দূরে সরে গেল)


using System;
using System.Windows.Forms;
using System.Reflection;
using System.CodeDom.Compiler;

namespace ScriptingInterface
{
    public interface IScriptType1
    {
        string RunScript(int value);
    }
}

namespace ScriptingExample
{
    static class Program
    {
        /// 
        /// The main entry point for the application.
        /// 
        [STAThread]
        static void Main()
        {

            // Lets compile some code (I'm lazy, so I'll just hardcode it all, i'm sure you can work out how to read from a file/text box instead
            Assembly compiledScript = CompileCode(
                "namespace SimpleScripts" +
                "{" +
                "    public class MyScriptMul5 : ScriptingInterface.IScriptType1" +
                "    {" +
                "        public string RunScript(int value)" +
                "        {" +
                "            return this.ToString() + \" just ran! Result: \" + (value*5).ToString();" +
                "        }" +
                "    }" +
                "    public class MyScriptNegate : ScriptingInterface.IScriptType1" +
                "    {" +
                "        public string RunScript(int value)" +
                "        {" +
                "            return this.ToString() + \" just ran! Result: \" + (-value).ToString();" +
                "        }" +
                "    }" +
                "}");

            if (compiledScript != null)
            {
                RunScript(compiledScript);
            }
        }

        static Assembly CompileCode(string code)
        {
            // Create a code provider
            // This class implements the 'CodeDomProvider' class as its base. All of the current .Net languages (at least Microsoft ones)
            // come with thier own implemtation, thus you can allow the user to use the language of thier choice (though i recommend that
            // you don't allow the use of c++, which is too volatile for scripting use - memory leaks anyone?)
            Microsoft.CSharp.CSharpCodeProvider csProvider = new Microsoft.CSharp.CSharpCodeProvider();

            // Setup our options
            CompilerParameters options = new CompilerParameters();
            options.GenerateExecutable = false; // we want a Dll (or "Class Library" as its called in .Net)
            options.GenerateInMemory = true; // Saves us from deleting the Dll when we are done with it, though you could set this to false and save start-up time by next time by not having to re-compile
            // And set any others you want, there a quite a few, take some time to look through them all and decide which fit your application best!

            // Add any references you want the users to be able to access, be warned that giving them access to some classes can allow
            // harmful code to be written and executed. I recommend that you write your own Class library that is the only reference it allows
            // thus they can only do the things you want them to.
            // (though things like "System.Xml.dll" can be useful, just need to provide a way users can read a file to pass in to it)
            // Just to avoid bloatin this example to much, we will just add THIS program to its references, that way we don't need another
            // project to store the interfaces that both this class and the other uses. Just remember, this will expose ALL public classes to
            // the "script"
            options.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location);

            // Compile our code
            CompilerResults result;
            result = csProvider.CompileAssemblyFromSource(options, code);

            if (result.Errors.HasErrors)
            {
                // TODO: report back to the user that the script has errored
                return null;
            }

            if (result.Errors.HasWarnings)
            {
                // TODO: tell the user about the warnings, might want to prompt them if they want to continue
                // runnning the "script"
            }

            return result.CompiledAssembly;
        }

        static void RunScript(Assembly script)
        {
            // Now that we have a compiled script, lets run them
            foreach (Type type in script.GetExportedTypes())
            {
                foreach (Type iface in type.GetInterfaces())
                {
                    if (iface == typeof(ScriptingInterface.IScriptType1))
                    {
                        // yay, we found a script interface, lets create it and run it!

                        // Get the constructor for the current type
                        // you can also specify what creation parameter types you want to pass to it,
                        // so you could possibly pass in data it might need, or a class that it can use to query the host application
                        ConstructorInfo constructor = type.GetConstructor(System.Type.EmptyTypes);
                        if (constructor != null && constructor.IsPublic)
                        {
                            // lets be friendly and only do things legitimitely by only using valid constructors

                            // we specified that we wanted a constructor that doesn't take parameters, so don't pass parameters
                            ScriptingInterface.IScriptType1 scriptObject = constructor.Invoke(null) as ScriptingInterface.IScriptType1;
                            if (scriptObject != null)
                            {
                                //Lets run our script and display its results
                                MessageBox.Show(scriptObject.RunScript(50));
                            }
                            else
                            {
                                // hmmm, for some reason it didn't create the object
                                // this shouldn't happen, as we have been doing checks all along, but we should
                                // inform the user something bad has happened, and possibly request them to send
                                // you the script so you can debug this problem
                            }
                        }
                        else
                        {
                            // and even more friendly and explain that there was no valid constructor
                            // found and thats why this script object wasn't run
                        }
                    }
                }
            }
        }
    }
}


4
আপনি কি জানেন যে এটি মনোতেও কাজ করবে বা এটি কেবল। নেট এ উপলব্ধ?
ম্যাথু শার্লে

4
এফওয়াইআই এবং অন্য যে কারও জন্য কৌতূহল রয়েছে, হ্যাঁ, এটি সংকলন করে মনোোতে ঠিক আছে run সংকলনের অংশগুলির জন্য কেবলমাত্র সিস্টেম রেফারেন্সের প্রয়োজন।
ম্যাথিউ শারলে

4
এটি করা অ্যাপডোমাইনকে দূষিত করে
ড্যানিয়েল লিটল

4
@ লাভিনস্কি যদি আপনি এটি আপনার অ্যাপডোমাইন দূষিত করতে না চান তবে কেবল একটি নতুন তৈরি করুন (এটি সম্ভবত একটি ভাল ধারণা যা আপনি "স্ক্রিপ্টগুলিতে" আরও কঠোর সুরক্ষা রাখতে পারেন)
গ্রান্ট পিটারস

4
@ ল্যান্ডার - এটি অত্যন্ত হালকা ওজনের। উপরের কোডটি একটি সম্পূর্ণ প্রোগ্রাম যা "স্ক্রিপ্টিং" সমর্থন করে। csscript.netদেখে মনে হচ্ছে এটি এর উপর কোনও ধরণের আবরণ। এটি মূলত একটি খালি হাড় বাস্তবায়ন implementation আমি মনে করি একটি আরও ভাল প্রশ্ন "csscript.net আমার জন্য কি করে যে এটি করে না"। আমি জানি না সিএসক্রিপ্ট কী করছে, তবে তারা অবশ্যই নিশ্চিতভাবে জানতে পারে যে উপরের কোডটি এখানে কী করে, তাদের কাছে এটি (বা চূড়ান্ত অনুরূপ কিছু) রয়েছে তাদের লাইব্রেরিতে।
গ্র্যান্ট পিটারস


19

পাওয়ারশেল ইঞ্জিনটি এটিকে স্ক্রিপ্টযোগ্য করার জন্য সহজেই একটি অ্যাপ্লিকেশনটিতে এম্বেড করার জন্য ডিজাইন করা হয়েছিল। আসলে, পাওয়ারশেল সিএলআই ইঞ্জিনের কেবল একটি পাঠ্য ভিত্তিক ইন্টারফেস।

সম্পাদনা করুন: https://devblogs.microsoft.com/powershell/making-applications-scriptable-via-powershell/ দেখুন


আমি মনে করি এটি সর্বোত্তম সমাধান কারণ এটি অ্যাপডোমায়নে বস্তু যুক্ত করে না। ইন। নেট আপনি কখনই সমাবেশ বা ক্লাসগুলি আনলোড করতে পারবেন না।
ড্যানিয়েল লিটল

12

বু ভাষা।


4
মৃত মনে হচ্ছে যদি এটা এ প্রকল্প এর github.com/boo-lang/boo
kristianp

@ ক্রিশ্চিয়ানপ এখন পর্যন্ত, এই প্রকল্পে প্রতি মাসে কয়েকটি কমিট (সাম্প্রতিক এক মাস আগে পর্যন্ত) চলছে are সুতরাং এটি কিছুটা ট্র্যাকশন হারিয়ে ফেলেছে, তবে এটি এখনও জীবিত বলে মনে হচ্ছে।
ট্যামস সেজেলি

8

আমার পছন্দের স্ক্রিপ্টিং ভাষাটি আজকাল লুয়া হবে । এটি ছোট, দ্রুত, পরিষ্কার, সম্পূর্ণ নথিভুক্ত, ভাল সমর্থিত, একটি দুর্দান্ত সম্প্রদায় রয়েছে , এটি শিল্পের অনেক বড় সংস্থাগুলি (অ্যাডোব, ব্লিজার্ড, ইএ গেমস) দ্বারা ব্যবহার করা হয়, এটি নির্ধারিতভাবে চেষ্টা করার মতো মূল্যবান।

.NET ভাষায় এটি ব্যবহার করার জন্য লুয়াআইন্টারফেস প্রকল্পটি আপনার প্রয়োজনীয় সমস্ত সরবরাহ করবে।


4
লুয়া গ্যারি'র মোডে স্ক্রিপ্টিংয়ের জন্যও ব্যবহৃত হয় যা দুর্দান্ত খেলা :)
বেনাম কাপুরুষ



2

আয়রন পাইথনের পক্ষে আর একটি ভোট। এটি এম্বেড করা সহজ, নেট। ক্লাসগুলির সাথে আন্তঃব্যবস্থাপনা এবং ভাল, এটি পাইথন।


1

আমি এস # এর প্রস্তাব দিতে পারি যা বর্তমানে আমি রক্ষণ করি। এটি একটি ওপেন সোর্স প্রকল্প, সি # তে লিখিত এবং নেট অ্যাপ্লিকেশনগুলির জন্য ডিজাইন করা হয়েছে।

প্রথমদিকে (2007-2009) এটি http://www.codeplex.com/scriptdotnet এ হোস্ট করা হয়েছিল , তবে সম্প্রতি এটি গিথুবে স্থানান্তরিত হয়েছে।


আপনার উত্তর পোস্ট করার জন্য ধন্যবাদ! দয়া করে স্ব-প্রচারের এফএকিউ অবশ্যই মনোযোগ সহকারে পড়তে ভুলবেন না । এছাড়াও নোট করুন যে প্রতিবার আপনার নিজের সাইট / পণ্যের সাথে লিঙ্ক করার পরে আপনাকে একটি অস্বীকার পোস্ট করা আবশ্যক
অ্যান্ড্রু বারবার

পরামর্শের জন্য ধন্যবাদ অ্যান্ড্রু। পূর্ববর্তী উত্তরগুলির মধ্যে একটিতে এই স্ক্রিপ্টিং ভাষার একটি পুরানো লিঙ্ক রয়েছে। কোনও কারণে আমি মূল উত্তরে মন্তব্য যুক্ত করতে পারছি না, এইভাবে আমি সঠিক লিঙ্ক সরবরাহ করতে একটি নতুন পোস্ট করেছি।
পিটার

1

ইলা চেষ্টা করুন । এটি হাস্কেলের অনুরূপ একটি কার্যকরী ভাষা এবং কোনও। নেট অ্যাপ্লিকেশনটিতে এম্বেড করা যেতে পারে । এমনকি এটির সহজ তবে ব্যবহারযোগ্য আইডিই রয়েছে।



0

আমি কেবলমাত্র একটি ক্লায়েন্টের জন্য একটি প্লাগইন তৈরি করেছি, তাদের মডিগুলিতে সি # কোড লেখার অনুমতি দিয়েছি যা অফিসের জন্য ভিবিএর মতো কাজ করে।



0

আমি নিজে সি # দিয়ে স্ক্রিপ্ট করা পছন্দ করি । এখন, ২০১৩ সালে, সি # স্ক্রিপ্টিংয়ের জন্য যথেষ্ট ভাল সমর্থন রয়েছে, এর জন্য আরও আরও বেশি গ্রন্থাগার পাওয়া যাচ্ছে becoming

স্ক্রিপ্ট সি # কোডে মনো-র দুর্দান্ত সমর্থন রয়েছে এবং আপনি কেবলমাত্র Mono.CSharp.dllআপনার অ্যাপ্লিকেশনটিতে অন্তর্ভুক্ত করে এটি নেট নেট দ্বারা ব্যবহার করতে পারেন । সি # স্ক্রিপ্টিং অ্যাপ্লিকেশনের জন্য যা আমি CShell চেক আউট করেছি

এছাড়াও চেক আউট মধ্যে `ScriptEngine ' Roslyn যা Microsoft থেকে, কিন্তু এই শুধুমাত্র অন্তর্গত CTP হয়।

কিছু লোক যেমন ইতিমধ্যে উল্লেখ করেছে, সিএস-স্ক্রিপ্ট বেশ কিছুদিন ধরেই ছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.