スポンサーリンク

C#: Code DomainでRoslynコンパイラを使用する

CodeDomで新しいコンパイラを使用したい!

GitHub – aspnet/RoslynCodeDomProvider: Roslyn CodeDOM provider

NuGet packages · dotnet/roslyn Wiki · GitHub(RoslynのバージョンとC#バージョンとの対応)

C# コンパイラを使用してプログラムによってコードをコンパイルする方法

上のサンプルをRoslyn CodeDom providerを使用するように変更した。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<span class="hljs-keyword">using</span> <span class="hljs-keyword">System</span>;
<span class="hljs-keyword">using</span> <span class="hljs-keyword">System</span>.Drawing;
<span class="hljs-keyword">using</span> <span class="hljs-keyword">System</span>.Windows.Forms;
<span class="hljs-keyword">using</span> <span class="hljs-keyword">System</span>.CodeDom.Compiler;
<span class="hljs-keyword">using</span> <span class="hljs-keyword">System</span>.<span class="hljs-keyword">Diagnostics</span>;
namespace CodeDomainSample
{
<span class="hljs-built_in">public</span> partial <span class="hljs-keyword">class</span> Form1 : Form
{
<span class="hljs-built_in">public</span> Form1()
{
InitializeComponent();
}
private <span class="hljs-type">void</span> button1_Click(<span class="hljs-keyword">object</span> sender, <span class="hljs-keyword">System</span>.EventArgs e)
{
//Roslynを使用したCodeDomainProviderを使用する。
CodeDomProvider codeProvider = <span class="hljs-built_in">new</span> Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider();
string Output = "Out.exe";
Button ButtonObject = (Button)sender;
textBox2.Text = "";
<span class="hljs-keyword">System</span>.CodeDom.Compiler.CompilerParameters parameters = <span class="hljs-built_in">new</span> CompilerParameters();
//Make sure we generate an EXE, <span class="hljs-keyword">not</span> a DLL
parameters.GenerateExecutable = <span class="hljs-keyword">true</span>;
parameters.OutputAssembly = Output;
parameters.CompilerOptions = "-langversion:7.3"; // C#のバージョンを指定する。
CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, textBox1.Text);
<span class="hljs-keyword">if</span> (results.Errors.Count > <span class="hljs-number">0</span>)
{
textBox2.ForeColor = Color.Red;
<span class="hljs-keyword">foreach</span> (CompilerError CompErr <span class="hljs-keyword">in</span> results.Errors)
{
textBox2.Text = textBox2.Text +
"Line number " + CompErr.Line +
", Error Number: " + CompErr.ErrorNumber +
", '" + CompErr.ErrorText + ";" +
Environment.NewLine + Environment.NewLine;
}
}
<span class="hljs-keyword">else</span>
{
//Successful Compile
textBox2.ForeColor = Color.Blue;
textBox2.Text = "Success!";
//<span class="hljs-keyword">If</span> we clicked run <span class="hljs-keyword">then</span> launch our EXE
<span class="hljs-keyword">if</span> (ButtonObject.Text == "Run") Process.<span class="hljs-keyword">Start</span>(Output);
}
}
private <span class="hljs-type">void</span> button2_Click(<span class="hljs-keyword">object</span> sender, EventArgs e)
{
button1_Click(sender, e);
}
}
}
<span class="hljs-keyword">using</span> <span class="hljs-keyword">System</span>; <span class="hljs-keyword">using</span> <span class="hljs-keyword">System</span>.Drawing; <span class="hljs-keyword">using</span> <span class="hljs-keyword">System</span>.Windows.Forms; <span class="hljs-keyword">using</span> <span class="hljs-keyword">System</span>.CodeDom.Compiler; <span class="hljs-keyword">using</span> <span class="hljs-keyword">System</span>.<span class="hljs-keyword">Diagnostics</span>; namespace CodeDomainSample { <span class="hljs-built_in">public</span> partial <span class="hljs-keyword">class</span> Form1 : Form { <span class="hljs-built_in">public</span> Form1() { InitializeComponent(); } private <span class="hljs-type">void</span> button1_Click(<span class="hljs-keyword">object</span> sender, <span class="hljs-keyword">System</span>.EventArgs e) { //Roslynを使用したCodeDomainProviderを使用する。 CodeDomProvider codeProvider = <span class="hljs-built_in">new</span> Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider(); string Output = "Out.exe"; Button ButtonObject = (Button)sender; textBox2.Text = ""; <span class="hljs-keyword">System</span>.CodeDom.Compiler.CompilerParameters parameters = <span class="hljs-built_in">new</span> CompilerParameters(); //Make sure we generate an EXE, <span class="hljs-keyword">not</span> a DLL parameters.GenerateExecutable = <span class="hljs-keyword">true</span>; parameters.OutputAssembly = Output; parameters.CompilerOptions = "-langversion:7.3"; // C#のバージョンを指定する。 CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, textBox1.Text); <span class="hljs-keyword">if</span> (results.Errors.Count > <span class="hljs-number">0</span>) { textBox2.ForeColor = Color.Red; <span class="hljs-keyword">foreach</span> (CompilerError CompErr <span class="hljs-keyword">in</span> results.Errors) { textBox2.Text = textBox2.Text + "Line number " + CompErr.Line + ", Error Number: " + CompErr.ErrorNumber + ", '" + CompErr.ErrorText + ";" + Environment.NewLine + Environment.NewLine; } } <span class="hljs-keyword">else</span> { //Successful Compile textBox2.ForeColor = Color.Blue; textBox2.Text = "Success!"; //<span class="hljs-keyword">If</span> we clicked run <span class="hljs-keyword">then</span> launch our EXE <span class="hljs-keyword">if</span> (ButtonObject.Text == "Run") Process.<span class="hljs-keyword">Start</span>(Output); } } private <span class="hljs-type">void</span> button2_Click(<span class="hljs-keyword">object</span> sender, EventArgs e) { button1_Click(sender, e); } } }
using System;
using System.Drawing;
using System.Windows.Forms;
using System.CodeDom.Compiler;
using System.Diagnostics;

namespace CodeDomainSample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            //Roslynを使用したCodeDomainProviderを使用する。
            CodeDomProvider codeProvider = new Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider();
            string Output = "Out.exe";
            Button ButtonObject = (Button)sender;

            textBox2.Text = "";
            System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
            //Make sure we generate an EXE, not a DLL
            parameters.GenerateExecutable = true;
            parameters.OutputAssembly = Output;
            parameters.CompilerOptions = "-langversion:7.3"; // C#のバージョンを指定する。
            CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, textBox1.Text);

            if (results.Errors.Count > 0)
            {
                textBox2.ForeColor = Color.Red;
                foreach (CompilerError CompErr in results.Errors)
                {
                    textBox2.Text = textBox2.Text +
                                "Line number " + CompErr.Line +
                                ", Error Number: " + CompErr.ErrorNumber +
                                ", '" + CompErr.ErrorText + ";" +
                                Environment.NewLine + Environment.NewLine;
                }
            }
            else
            {
                //Successful Compile
                textBox2.ForeColor = Color.Blue;
                textBox2.Text = "Success!";
                //If we clicked run then launch our EXE
                if (ButtonObject.Text == "Run") Process.Start(Output);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            button1_Click(sender, e);
        }
    }

}

コメント

タイトルとURLをコピーしました