예제 #1
0
        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);

            }
        }
예제 #2
0
        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);
            }
        }