以前は、CodeDOM CompilationUnits をファイルにエクスポートし、それらのファイルを読み込んで、CSharpCodeProvider を使用してコンパイルしていました。今日、CodeDOM が String にエクスポートされるようにコードをリファクタリングしました。
public static string compileToString(CodeCompileUnit cu){
// Generate the code with the C# code provider.
CSharpCodeProvider provider = new CSharpCodeProvider();
using (StringWriter sw = new StringWriter())
{
IndentedTextWriter tw = new IndentedTextWriter(sw, " ");
// Generate source code using the code provider.
provider.GenerateCodeFromCompileUnit(cu, tw,
new CodeGeneratorOptions());
tw.Close();
return sw.ToString ();
}
}
次に、CompileFromSource を使用するようにコンパイルを変更しました。
public static Assembly BuildAssemblyFromString(string code){
Microsoft.CSharp.CSharpCodeProvider provider =
new CSharpCodeProvider();
ICodeCompiler compiler = provider.CreateCompiler();
CompilerParameters compilerparams = new CompilerParameters();
compilerparams.GenerateExecutable = false;
compilerparams.GenerateInMemory = true;
compilerparams.CompilerOptions = "/nowarn:162";
string[] files = new string[]{"TemplateAesthetic.cs"};
CompilerResults results =
compiler.CompileAssemblyFromSource(compilerparams, code);
if (results.Errors.HasErrors)
{
StringBuilder errors = new StringBuilder("Compiler Errors :\r\n");
foreach (CompilerError error in results.Errors )
{
errors.AppendFormat("Line {0},{1}\t: {2}\n",
error.Line, error.Column, error.ErrorText);
Debug.Log (error.ErrorText);
}
}
else
{
return results.CompiledAssembly;
}
return null;
}
気づかせてくれた Maarten に感謝します。問題は、コンパイル プロセスに実際のファイル (TemplateAesthetic.cs) を含める必要があることですが、このコンパイルは文字列から行われます。CompileAssemblyFromSource を使用して、この方法で混合コンパイルを実行できますか?