/// <summary> /// Compiles the template. /// </summary> /// <param name="className">The class name of the dynamic type.</param> /// <param name="template">The template to compile.</param> /// <param name="modelType">[Optional] The mode type.</param> private CompilerResults Compile(string className, string template, Type modelType = null) { var languageService = provider.CreateLanguageService(); var codeDom = provider.CreateCodeDomProvider(); var host = new RazorEngineHost(languageService); var generator = languageService.CreateCodeGenerator(className, "Razor.Dynamic", null, host); var parser = new RazorParser(languageService.CreateCodeParser(), new HtmlMarkupParser()); Type baseType = (modelType == null) ? typeof(TemplateBase) : typeof(TemplateBase <>).MakeGenericType(modelType); generator.GeneratedClass.BaseTypes.Add(baseType); using (var reader = new StreamReader(new MemoryStream(Encoding.ASCII.GetBytes(template)))) { parser.Parse(reader, generator); } var statement = new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "Clear"); generator.GeneratedExecuteMethod.Statements.Insert(0, new CodeExpressionStatement(statement)); var builder = new StringBuilder(); using (var writer = new StringWriter(builder)) { codeDom.GenerateCodeFromCompileUnit(generator.GeneratedCode, writer, new CodeGeneratorOptions()); } var @params = new CompilerParameters(); foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { if (!assembly.IsDynamic) { @params.ReferencedAssemblies.Add(assembly.Location); } } @params.GenerateInMemory = true; @params.IncludeDebugInformation = false; @params.GenerateExecutable = false; @params.CompilerOptions = "/target:library /optimize"; @params.TempFiles.KeepFiles = KeepFiles; var result = codeDom.CompileAssemblyFromSource(@params, new[] { builder.ToString() }); return(result); }