ساخت یک C# Code Editor با استفاده از WPF

یکشنبه 13 تیر 1395

در این مقاله ما می خواهیم یک C# Code Editor (ویرایشگر کد در سی شارپ) ایجاد کنیم. این C# Code Editor دارای ویژگی هایی مانند ویرایش، کامپایل و build کردن کدها نیز می باشد.

ساخت یک C# Code Editor با استفاده از WPF

به عنوان یک برنامه نویس گاهی ما مجبور هستیم که برنامه های کوتاهی (با تعداد خط های محدود) برای PoC و یا برای تحقیق و آزمایش بنویسیم  .برای انجام این کار، نیاز داریم تا برنامه ی Visual Studio را باز کنیم، یک solution ایجاد کنیم، آن را build کنیم و در نهایت برنامه را اجرا و آزمایش کنیم. برای چنین مواردی، می توانیم از برنامه ای که در این مقاله می سازیم استفاده کنیم تا بتوانیم کدهایمان را با سرعت زیادی ویرایش و اجرا کنیم . محیط این برنامه مانند تصویر زیر می باشد:

برای ساخت برنامه مراحل زیر را باید انجام دهیم:

یک برنامه ی WPF ایجاد کنید و نام آن را MyCodeEditor بگذارید. (با نسخه های Visual Studio 2010 و یا بالاتر این برنامه را بسازید. ) سپس کتابخانه AvalonEdit را با استفاده از NuGet و مانند تصویر زیر به پروژه اضافه کنید. این کتابخانه، دارای یک textbox پیشرفته است که کدهای ما را مانند Visual Studio Editor فرمت بندی می کند.

UI برنامه را طوری طراحی کنید که دارای یک بخش برای  انتخاب framework  ، یک بخش برای انتخاب نوع خروجی (dll و یاexe ) ، یک دکمه برای اجرای کدهای نوشته شده ، یک کنترل AvalonEdit برای ویرایش کد و یک textbox برای نمایش خروجی C# compiler باشد. این بخش ها در شکل زیر مشخص شده اند:

 

در رویداد window_loaded ما از یک KB318785 برای پیدا کردن لیست .NET framework ها استفاده کرده ایم. (این کار از طریق registry key ها استفاده می شود.)

    private void Window_Loaded(object sender, RoutedEventArgs e)   
    {  
        AddVersion(@  
        "Software\Microsoft\.NET Framework\Policy\v1.0", "1.0 ");  
        AddVersion(@  
        "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322", "1.1 ");  
        AddVersion(@  
        "Software\Microsoft\NET Framework Setup\NDP\v2.0.50727", "2.0 ");  
        AddVersion(@  
        "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0", "3.0 ");  
        AddVersion(@  
        "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5", "3.5 ");  
        AddVersion(@  
        "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full", "4.0 ");  
        CboTypes.SelectedIndex = 0;  
        OutputCC.Text = "";  
        textEditor.Text = "using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Text;\r\n\r\npublic class Test\r\n{\r\n public static void Main() \r\n {\r\n System.Console.WriteLine(\"Hello, World!\"); \r\n }\r\n}";  
        CboVersions.SelectedIndex = 0;  
    }

در متد AddVersion ما چک می کنیم که مسیر registry داده شده ، در سیستم موجود است یا خیر. و بر اساس نتیجه ی این کار .NET Framework های موجود را در یک combobox نمایش می دهیم.

در رویداد Button_Click ، ما کدی برای خواندن کدهای C# که در داخل کنترل AvalonEdit نوشته شده اند، می نویسیم ،آن ها را مانند یک فایل ذخیره می کنیم و بر اساس نسخه ی framework انتخاب شده به csc.exe مربوطه می فرستیم ، خروجی فایل csc.exe را می خوانیم و آن را به کنترل textbox منتقل می کنیم. این تکه کد، کارهای زیر را برای ما انجام می دهد:

    private void Button_Click(object sender, RoutedEventArgs e)   
    {  
        try   
        {  
            ClearOldData();  
            string code = textEditor.Text;  
            string selectedVersion = CboVersions.Text;  
            File.WriteAllText(@  
            "C:\Test.cs", code);  
            string installPath = GetInstallPath(selectedVersion);  
            if (!string.IsNullOrEmpty(installPath))   
            {  
                Process p = new Process();  
                p.StartInfo.UseShellExecute = false;  
                p.StartInfo.RedirectStandardOutput = true;  
                p.StartInfo.FileName = installPath + "csc.exe";  
                p.StartInfo.CreateNoWindow = true;  
                p.StartInfo.Arguments = @  
                " /target:" + (CboTypes.Text == "dll" ? "library" : "exe") + @  
                " /out:c:\myfile." + CboTypes.Text + @  
                " c:\test.cs";  
                p.Start();  
                string output = p.StandardOutput.ReadToEnd();  
                p.WaitForExit();  
                output = output.Substring(output.IndexOf("reserved") + 9);  
                if (string.IsNullOrEmpty(output.Replace("\r\n", "")))   
                {  
                    OutputCC.Text = "Build Successful...";  
                    if (CboTypes.Text != "dll")  
                    {  
                        Process.Start(@  
                        "c:\myfile.exe");  
                        OutputCC.Text += "\r\n File Path:c:\\myfile.exe";  
                    } else   
                    {  
                        OutputCC.Text += "\r\n File Path:c:\\myfile.dll";  
                    }  
      
                } else   
                {  
                    OutputCC.Text = output;  
                }  
            }  
        } catch (Exception ex)  
        {  
      
            OutputCC.Text = ex.Message;  
        }  
    }

در برخی موارد ، برنامه ما نمی تواند مسیر درست csc.exe را تشخیص بدهد. برای برطرف کردن این مشکل، ما app.config را با کدهای زیر به برنامه اضافه می کنیم.

<?xml version="1.0"?>  
    <configuration>  
        <appSettings>  
            <add key="1.0" value=""/>  
            <add key="1.1" value=""/>  
            <add key="2.0" value=""/>  
            <add key="3.0" value=""/>  
            <add key="3.5" value="C:\Windows\Microsoft.NET\Framework64\v3.5\"/>  
            <add key="4.0" value=""/>  
        </appSettings>  
        <startup>  
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>  
        </startup>  
    </configuration>

اگر ما نوع خروجی را exe انتخاب کنیم، یک .EXE تولید خواهد شد و به صورت c:\ myfile.exe ذخیره و سپس اجرا خواهد شد. اگر نوع خروجی dll باشد، یک .DLL تولید خواهد شد و به صورت c:\myfile.dll ذخیره خواهد شد.

حالا بیایید برنامه ای که نوشتیم را اجرا کنیم، کدهایی در آن وارد کنیم و آن را آزمایش کنیم:

ما می توانیم در موارد بعدی این برنامه را با اضافه کردن reference هایی به external assembly ، قابلیت ویرایش و کامپایل همزمان چندین فایل  ، پشتیبانی از intellisense برای AvalonEdit textbox و ... گسترش بدهیم. این برنامه در حیطه ساخت و اجرای برنامه های ساده C# برای فعالیت های تحقیقاتی و یا PoC می تواند کمک زیادی به ما کند.

 

 

 

فایل های ضمیمه

سجاد باقرزاده

نویسنده 54 مقاله در برنامه نویسان
  • WPF
  • 3k بازدید
  • 2 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید