CodeDomで新しいコンパイラを使用したい!
GitHub – aspnet/RoslynCodeDomProvider: Roslyn CodeDOM provider
NuGet packages · dotnet/roslyn Wiki · GitHub(RoslynのバージョンとC#バージョンとの対応)
C# コンパイラを使用してプログラムによってコードをコンパイルする方法
上のサンプルをRoslyn CodeDom providerを使用するように変更した。
<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);
}
}
}
コメント