public static void BuilderTemplate(ITemplateInfo templateinfo,ITemplateHost host) { Type type = host.BaseType; string typename = "_" + Guid.NewGuid().ToString("N"); RazorTemplateEngine engine = CreateHost(type, "_" + type.Name, typename); AddNamespace(type.Namespace); GeneratorResults razorResults = null; using (System.IO.StreamReader reader = templateinfo.GetCode()) { razorResults = engine.GenerateCode(reader); CSharpCodeProvider codeProvider = new CSharpCodeProvider(); CodeGeneratorOptions options = new CodeGeneratorOptions(); string LastGeneratedCode = null; using (StringWriter writer = new StringWriter()) { codeProvider.GenerateCodeFromCompileUnit(razorResults.GeneratedCode, writer, options); templateinfo.Host.LastCompileSource = writer.ToString(); } CompilerParameters compilerParameters = new CompilerParameters(new string[0]); compilerParameters.OutputAssembly = "tmp_assembly" + typename; compilerParameters.GenerateInMemory = false; AddDomainAssemblies(); foreach (string item in ReferencedAssemblies) compilerParameters.ReferencedAssemblies.Add(item); compilerParameters.GenerateInMemory = true; CompilerResults compilerResults = codeProvider.CompileAssemblyFromDom(compilerParameters, razorResults.GeneratedCode); if (compilerResults.Errors.Count > 0) { string errormessage = null; int throwindex = 1; System.Text.StringBuilder sb = new System.Text.StringBuilder(); reader.BaseStream.Seek(0, SeekOrigin.Begin); using (System.IO.StreamReader line = new StreamReader(reader.BaseStream, reader.CurrentEncoding)) { ParserResults presult = engine.ParseTemplate(line); if (presult.ParserErrors.Count > 0) { throwindex = presult.ParserErrors[0].Location.LineIndex + 1; errormessage = presult.ParserErrors[0].Message; reader.BaseStream.Seek(0, SeekOrigin.Begin); using (System.IO.StreamReader readcode = new StreamReader(reader.BaseStream, reader.CurrentEncoding)) { string code = readcode.ReadLine(); while (code != null) { sb.AppendLine(code); code = readcode.ReadLine(); } } } else { throwindex = compilerResults.Errors[0].Line; errormessage = compilerResults.Errors[0].ErrorText; sb.Append(LastGeneratedCode); } } templateinfo.CompileError = errormessage; throw new RazorException(templateinfo.CompileError); } templateinfo.Assembly = compilerResults.CompiledAssembly; templateinfo.TemplateType = compilerResults.CompiledAssembly.GetType("_" + type.Name + "." + typename); } }
public static void BuilderTemplate(ITemplateInfo templateinfo, ITemplateHost host) { Type type = host.BaseType; string typename = "_" + Guid.NewGuid().ToString("N"); RazorTemplateEngine engine = CreateHost(type, "_" + type.Name, typename); AddNamespace(type.Namespace); GeneratorResults razorResults = null; using (System.IO.StreamReader reader = templateinfo.GetCode()) { razorResults = engine.GenerateCode(reader); CSharpCodeProvider codeProvider = new CSharpCodeProvider(); CodeGeneratorOptions options = new CodeGeneratorOptions(); string LastGeneratedCode = null; using (StringWriter writer = new StringWriter()) { codeProvider.GenerateCodeFromCompileUnit(razorResults.GeneratedCode, writer, options); templateinfo.Host.LastCompileSource = writer.ToString(); } CompilerParameters compilerParameters = new CompilerParameters(new string[0]); compilerParameters.OutputAssembly = "tmp_assembly" + typename; compilerParameters.GenerateInMemory = false; AddDomainAssemblies(); foreach (string item in ReferencedAssemblies) { compilerParameters.ReferencedAssemblies.Add(item); } compilerParameters.GenerateInMemory = true; CompilerResults compilerResults = codeProvider.CompileAssemblyFromDom(compilerParameters, razorResults.GeneratedCode); if (compilerResults.Errors.Count > 0) { string errormessage = null; int throwindex = 1; System.Text.StringBuilder sb = new System.Text.StringBuilder(); reader.BaseStream.Seek(0, SeekOrigin.Begin); using (System.IO.StreamReader line = new StreamReader(reader.BaseStream, reader.CurrentEncoding)) { ParserResults presult = engine.ParseTemplate(line); if (presult.ParserErrors.Count > 0) { throwindex = presult.ParserErrors[0].Location.LineIndex + 1; errormessage = presult.ParserErrors[0].Message; reader.BaseStream.Seek(0, SeekOrigin.Begin); using (System.IO.StreamReader readcode = new StreamReader(reader.BaseStream, reader.CurrentEncoding)) { string code = readcode.ReadLine(); while (code != null) { sb.AppendLine(code); code = readcode.ReadLine(); } } } else { throwindex = compilerResults.Errors[0].Line; errormessage = compilerResults.Errors[0].ErrorText; sb.Append(LastGeneratedCode); } } templateinfo.CompileError = errormessage; throw new RazorException(templateinfo.CompileError); } templateinfo.Assembly = compilerResults.CompiledAssembly; templateinfo.TemplateType = compilerResults.CompiledAssembly.GetType("_" + type.Name + "." + typename); } }