ব্যক্তিগতভাবে, আমি স্ক্রিপ্টিং ভাষা হিসাবে সি # ব্যবহার করব। .NET ফ্রেমওয়ার্ক (এবং মনো, ম্যাথিউ স্কারলে ধন্যবাদ) প্রকৃতপক্ষে ফ্রেমওয়ার্কটিতে প্রতিটি নেট নেটওয়ার্কের সংকলকগুলি অন্তর্ভুক্ত করে।
মূলত, এই সিস্টেমটি প্রয়োগের 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
{
[STAThread]
static void Main()
{
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)
{
Microsoft.CSharp.CSharpCodeProvider csProvider = new Microsoft.CSharp.CSharpCodeProvider();
CompilerParameters options = new CompilerParameters();
options.GenerateExecutable = false;
options.GenerateInMemory = true;
options.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location);
CompilerResults result;
result = csProvider.CompileAssemblyFromSource(options, code);
if (result.Errors.HasErrors)
{
return null;
}
if (result.Errors.HasWarnings)
{
}
return result.CompiledAssembly;
}
static void RunScript(Assembly script)
{
foreach (Type type in script.GetExportedTypes())
{
foreach (Type iface in type.GetInterfaces())
{
if (iface == typeof(ScriptingInterface.IScriptType1))
{
ConstructorInfo constructor = type.GetConstructor(System.Type.EmptyTypes);
if (constructor != null && constructor.IsPublic)
{
ScriptingInterface.IScriptType1 scriptObject = constructor.Invoke(null) as ScriptingInterface.IScriptType1;
if (scriptObject != null)
{
MessageBox.Show(scriptObject.RunScript(50));
}
else
{
}
}
else
{
}
}
}
}
}
}
}