C#のコードで動的にクラスをコンパイルして使用する

コードの実行中に、ソースコードをランタイムで動的にコンパイルして実行する方法。


using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System;
using System.Collections;
using System.ComponentModel;
using System.IO;
using System.Reflection;
using System.Text;

中略

CSharpCodeProvider provider = new CSharpCodeProvider();
ICodeCompiler compiler = provider.CreateCompiler();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateInMemory = true;

//実行中のアセンブリと同じ参照設定をおこなう
Assembly asm = Assembly.GetExecutingAssembly();
parameters.ReferencedAssemblies.Add(asm.Location);
AssemblyName[] assemblyNames = asm.GetReferencedAssemblies();
foreach(AssemblyName asmName in assemblyNames)
{
if(asmName.Name.StartsWith("System") || asmName.Name.StartsWith("mscorlib") )
{
parameters.ReferencedAssemblies.Add(asmName.Name + ".dll");
}
else if(asmName.Name.StartsWith("Oracle"))
{
Assembly oraAsm = Assembly.Load(asmName);
parameters.ReferencedAssemblies.Add(oraAsm.Location);

}
else
{
parameters.ReferencedAssemblies.Add(binPath + asmName.Name + ".dll");
}
Trace.Write(asmName.FullName);
}

//コンパイル実行
CompilerResults results = compiler.CompileAssemblyFromSource(parameters,src);
if(results.Errors.HasErrors)
{
StringBuilder sbErrorMsg = new StringBuilder();
foreach(CompilerError error in results.Errors)
{
sbErrorMsg.Append(error.ErrorText).Append(" 行:").Append(error.Line).Append(" 列:").Append(error.Column).Append("\r\n");
}
txtCompileErrors.Text = sbErrorMsg.ToString();
return;
}
txtCompileErrors.Text = "";

//コンパイルされたアセンブリ、クラスの取得
Assembly compiledAssembly = results.CompiledAssembly;

Type casperType = compiledAssembly.GetType("ClassName");
object casper = casperType.GetConstructor(Type.EmptyTypes).Invoke(null);