سلام
دو راه حل به نظرم می رسه:
-
قطعه کد داخل richTextBox رو در قالب یه فایل متنی ذخیره کنید و بعد برای کامپایلر ارسال کنید.
-
مستقیما از کلاس CSharpCodeProvider استفاده کنید تا به کامپایلر در زمان اجرا هم دسترسی داشته باشید. (روش رسمی)
خب حالا به روش اول، کار رو شروع می کنیم؛ بعد از این که یه پروژه ی WindowsForm ایجاد کردیم و یه جعبه ی متنی هم، روش جانمایی کردیم، باید این دکمه ها رو، به پنجره اضافه کنیم:
-
دوتا دکمه ی Save و Load برای ذخیره و بازآوری کد های منبع
-
یه دکمه ی Run هم، برای اجرای کد های منبع
** برای دکمه ی Load، این کد رو:
richTextBox1.LoadFile(@"C:\Program Files\My IDE\USERApp.txt; richTextBoxStreamType.PlainText" );
** و برای دکمه ی Save هم، این کد رو اضافه می کنیم:
richTextBox1.SaveFile(@"C:\Program Files\My IDE\USERApp.txt; richTextBoxStreamType.PlainText" );
با این کار، هر وقت متن رو درون جعبه بنویسیم، با زدن دکمه ی Save، ذخیره و با دکمه ی Load، فراخوانی میشه.
** و اما دکمه ی Run؛ در این مرحله، نیاز به یه اسکریپت Batch داریم تا با اجرای کامپایلر، کد های منبع رو اجرا کنه. اما قبل از هر چیز، میایم و کد مورد نیاز دکمه ی Run رو، بهش الصاق می کنیم:
using System.Diagnostics;
class Program
{
static void Main()
{
System.Diagnostics.Process.Start("cmd.exe", @"/c c:\Program Files\My IDE\MyBat.bat");
}
}
این جوری هر وقت دکمه ی Run کلیک بشه، اسکریپت ما اجرا میشه.
اما اسکریپت ما که قراره کدهای کاربر رو اجرا کنه، چطوری باید باشه؟
یه فایل متنی باز می کنیم و با نام MyBat.bat در مسیر زیر ذخیره می کنیم:
c:\Program Files\My IDE\MyBat.bat
حالا این کد هارو می ریزیم توش:
REM Delete Temporarily Files then, Copy USERApp.txt to C:\ directory
del C:\USERApp.txt && copy C:\Program Files\My IDE\USERApp.txt C:\USERApp.txt
cd C:\
REM Saving the Plain USERApp.txt into a CSharp file format
ren USERApp.txt USERApp.cs
REM Calling Csharp Compiler to Run the Source Code:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /t:exe /out:,USERApp.exe USERApp.cs && MyApp.exe
با این اسکریپت، ما اول، فایل متنی USERApp.txt که کد های کاربر در richTextBox هست رو، به دایرکتوری ریشه می بریم. بعد قالب این فایل متنی رو، به قالب استاندارد سی شارپ تغییر می دیم؛ یعنی USERApp.cs. حالا با قرار گرفتن در مسیر ریشه (یعنی جایی که USERApp.cs رو ذخیره کردیم)، کامپایلر سی شارپ رو فرا می خونیم. بعد از کامپایل شدن، USERApp.exe اجرا میشه.
نکته ی مهم، محل کامپایلر سی شارپه؛ این کار با توجه به نسخه ی چارچوب کاری دات نت نصب شده در سیستم عامل کاربر انجام میشه. یعنی هر نسخه از دات نت، محل کامپایلرش جداس؛ مثلا من که دات نت 4.5 دارم، آدرسش میشه این خط از اسکریپت:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
حالا بسته به این که رو سیستم کاربر، چه نسخه ای از دات نت نصب هست، این عددِ v4.0.30319 متفاوته؛
برای این که به مشکل بر نخوریم، وقتی فایل نصاب برنامه رو می خوایم آماده کنیم، میایم و بسته ی دات نت 4.5 رو هم به اون اضافه می کنیم. وقتی کاربر مورد نظر، نصاب رو اجرا می کنه، ابتدا چارچوب کاری دات نت در سیستمش نصب میشه و بعد برنامه ی شما در محل مورد نظر کپی میشه.
این جوری دیگه لازم نیست تا کاربر محل کامپایلر رو هم معرفی کنه. (همونی که تو اسکریپت نوشتیم، میشه محل کامپایلر)
خب کار تمام شده و برنامه رو با این شرایط کامپایل می کنیم:
-
یه پنجره داریم، یه جعبه ی متنی و سه تا دکمه
-
کاربر کد ها رو، درون جعبه وارد می کنه و دکمه ی Save رو میزنه.
-
حالا کد های منبع وارد شده، در قالب یه فایل متنی، در دایرکتوری کاربر ذخیره شده.
-
با زدن دکمه ی Run، برنامه ی مورد نظر کاربر، روی کنسول اجرا میشه.
-
حالا اینجا اگه کاربر بخواد، می تونه کد رو تو همون جعبه ویرایش کنه و دوباره Save کنه. دکمه ی Load هم به این دلیل استفاده می کنیم که، کاربر بتونه هر لحظه کدهاشو کنترل کنه.
اگه برنامه قرار بود، کد های c یا c++ کاربر رو، کامپایل کنه، اون وقت کار خیلی آسون تر می شد؛ چرا که برای دستیابی به gcc، راه دشواری پیش روی ما نبود.