ساخت یک ویرایشگر کد سی شارپ با استفاده از WPF

ویرایشگر کد سی شارپ

ساخت یک ویرایشگر کد سی شارپ با استفاده از WPF ما به عنوان یک توسعه دهنده (developer)، ما اپلیکیشن های زیادی برای PC نوشته ایم یا تحقیقاتی که چند خط کد داشته اند. برای انجام آن، لازم است که ویژوال استادیو را باز کنید، یک solution ایجاد کنید، آن را بسازید و بعد از تست کردن پاک کنید. در این سناریو ها، ما می توانیم با استفاده از این اپلیکیشن کد ها را سریع ویرایش و اجرا کنیم مانند تصویر زیر:

ویرایشگر کد سی شارپ

یک اپلیکیشن WPF در ویژوال استادیو بسازید و نام آن را MyCodeEditor بگزارید. سپس AvalonEdit library را با استفاده از NuGet مانند تصویر زیر اضافه کنید. این داشتن یک تکست باکس (textbox) پیشرفته است که نسخه پشتیبانی برای کد formatting\coloring را نیز دارد مانند ویرایشگر ویژوال استادیو.

ویرایشگر کد سی شارپ

یک UI با گزینه انتخاب target framework طراحی کنید، خروجی آن را dll یا exe انتخاب کنید، دکمه اجرای کد نوشته شده و کنترل AvalonEdit را برای ویرایش کردن کد طراحی و یک تکست باکس برای نمایش خروجی سی شارپ بسازید، مثل تصویر زیر:

ویرایشگر کد سی شارپ

طراحی UI

در رخداد های window_loaded، ما از KB318785 برای پیدا کردن لیست .NET frameworks نصب شده در registry keys استفاده می کنیم.

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) پایان یافته وجود دارد یا خیر. بر آن اساس ما آن را به مشخصه (combo box) .NET Frameworks اضافه می کنیم.

در گزارشات Button_Click، ما یک کد برای خواندن کد سی شارپ وارد شده در AvalonEdit می نویسیم، آن را به عنوان یک فایل ذخیره می کنیم، بر اساس ورژن framework انتخاب شده آن را به مکاتبه های csc.exe (corresponding) رد می کنیم. خروجی csc.exe را می خوانیم و به خروجی تکست باکس کنترل رد می کنیم مانند قطعه کد زیر:

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را به همراه آدرس hard-coded در آن اضافه می کنیم، مانند قطعه کد زیر که برای انتخاب درست csc.exe. است.

<?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 ذخیره می کنیم.

حالا اپلیکیشن را اجرا کنید و مانند تصویر زیر چند خط کد وارد کنید:

ویرایشگر کد سی شارپ

 

ما می توانیم این اپلیکیشن را با فراهم کردن گذینه هایی مثل adding reference to external assembly، edit\compile multiple files، intellisense support in AvalonEdit textbox و … بیشتر گشترش دهیم.

هم چنین این نرم افزار وقت مارا برای ساخت و اجرای نرم افزار های ساده سی شارپ برای PC یا جستجوی فعالیت ها تلف نمی کند.

محمد نجفی

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

ما یک پرسشنامه‌ی کوچولو داریم، که قول میدیم وقتتون رو خیلی نمی‌گیره، ولی کلی به ما کمک می‌کنه، چون هم assessment مونه ,و هم شما به ما در این زمینه کمک میکنید.بزن بریم