internal static TemplateCompilationResult Compile( Type templateType, string templateBody, IEnumerable<string> assemblyFileNames, IEnumerable<string> namespaces, string tempDirectory) { LoadRuntimeBinder(); string className; var compileUnit = GetCodeCompileUnit(templateType, namespaces, templateBody, out className); string sourceCode; CodeDomProvider codeProvider; switch (Language) { case TemplateCompilationLanguage.CSharp: codeProvider = new CSharpCodeProvider(); break; case TemplateCompilationLanguage.VisualBasic: codeProvider = new VBCodeProvider(); break; default: throw new NotSupportedException("Language not supported."); } var builder = new StringBuilder(); using (var writer = new StringWriter(builder, CultureInfo.InvariantCulture)) { codeProvider.GenerateCodeFromCompileUnit(compileUnit, writer, new CodeGeneratorOptions()); sourceCode = builder.ToString(); } var parameters = CreateCompilerParameters(tempDirectory, assemblyFileNames); var compileResult = codeProvider.CompileAssemblyFromDom(parameters, compileUnit); if (compileResult.Errors != null && compileResult.Errors.Count > 0) throw new TemplateCompilationException(compileResult.Errors, sourceCode, templateBody); var fullClassName = TEMPLATES_NAMESPACE + "." + className; return new TemplateCompilationResult { Type = compileResult.CompiledAssembly.GetType(fullClassName), SourceCode = sourceCode }; }