示例#1
0
        /// <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);
        }