public string Preview(TemplateInfo templateInfo, ITemplateGeneratorHost host, TemplateEngineSettings settings)
        {
            AppDomain temporaryDomain = CreateTempAppDomain();

            try
            {
                string assembly = Assembly.GetExecutingAssembly().GetName().FullName;
                string type     = this.GetType().FullName;
                log.Debug(string.Format("CreateInstanceAndUnwrap {0} {1}", assembly, type));
                TemplateEngineProxy proxy = (TemplateEngineProxy)temporaryDomain.CreateInstanceAndUnwrap(assembly, type);
                if (proxy == null)
                {
                    string msg = string.Format("Failed to locate the requested  type {0}", type);
                    log.Debug(msg);
                    throw new ServiceBrowserException(msg);
                }
                else
                {
                    string result = proxy._Preview(templateInfo, host, settings);
                    //log.Debug(result);
                    return(result);
                }
            }
            finally
            {
                AppDomain.Unload(temporaryDomain);
            }
        }
Example #2
0
        public string Preview(TemplateInfo templateInfo, ITemplateGeneratorHost host, TemplateEngineSettings templateEngineSettings)
        {
            ValidationUtils.ArgumentNotNull(templateInfo, "templateInfo");
            ValidationUtils.ArgumentNotNull(host, "host");
            ValidationUtils.ArgumentNotNull(templateEngineSettings, "templateEngineSettings");

            log.Debug(string.Format("Running template {0} from {1}", templateInfo.Name, templateInfo.Directory));
            string result;

            try
            {
                _templateEngineSettings = templateEngineSettings;
                string relativePath = "";
                string templateFile = Path.Combine(templateInfo.Directory, "preview.template");

                TemplateContext templateContext = new TemplateContext(relativePath, templateInfo.Directory, host);
                PushContext(templateContext);
                result = InternalProcessTemplate(relativePath, templateFile, "preview", host);
                PopContext();
            }
            catch (Exception ex)
            {
                log.Error("Failed generating template preview", ex);
                throw ex;
            }
            //log.Debug(result);
            return(result);
        }
        internal void _Execute(TemplateInfo templateInfo, ITemplateGeneratorHost host, TemplateEngineSettings settings)
        {
            StartLogging();
            ILog log = LogManager.GetLogger(typeof(TemplateEngineProxy));

            log.Debug(string.Format("Entering AppDomain: {0} {1}", AppDomain.CurrentDomain.FriendlyName, AppDomain.CurrentDomain.BaseDirectory));
            TemplateEngine templateEngine = new TemplateEngine();

            templateEngine.Execute(templateInfo, host, settings);
        }
        internal string _Preview(TemplateInfo templateInfo, ITemplateGeneratorHost host, TemplateEngineSettings settings)
        {
            StartLogging();
            ILog log = LogManager.GetLogger(typeof(TemplateEngineProxy));

            log.Debug(string.Format("Entering AppDomain: {0} {1}", AppDomain.CurrentDomain.FriendlyName, AppDomain.CurrentDomain.BaseDirectory));
            TemplateEngine templateEngine = new TemplateEngine();

            ValidationUtils.ObjectNotNull(templateEngine, "templateEngine");
            return(templateEngine.Preview(templateInfo, host, settings));
        }
Example #5
0
		public void Execute(TemplateInfo templateInfo, ITemplateGeneratorHost host, TemplateEngineSettings templateEngineSettings)
		{
			_templateEngineSettings = templateEngineSettings;
			string relativePath = "";
			try
			{
				host.Open();
				ProcessTemplates(relativePath, templateInfo.Directory, host);
			}
			finally
			{
				host.Close();
			}
		}
Example #6
0
        public void Execute(TemplateInfo templateInfo, ITemplateGeneratorHost host, TemplateEngineSettings templateEngineSettings)
        {
            _templateEngineSettings = templateEngineSettings;
            string relativePath = "";

            try
            {
                host.Open();
                ProcessTemplates(relativePath, templateInfo.Directory, host);
            }
            finally
            {
                host.Close();
            }
        }
Example #7
0
		internal TemplateContext(string relativePath, string templateDirectory, ITemplateGeneratorHost host)
		{
			_templateDirectory = templateDirectory;
			_relativePath = relativePath;
			_host = host;
			_context = new Hashtable();
			Hashtable globalContext = host.GetGlobalContext();
			if( globalContext != null )
			{
				foreach(DictionaryEntry entry in globalContext)
					_context.Add(entry.Key, entry.Value);
			}
			_directives = new Hashtable();
			_imports = new Hashtable();
			_assemblies = new Hashtable();
		}
        public void Execute(TemplateInfo templateInfo, ITemplateGeneratorHost host, TemplateEngineSettings settings)
        {
            AppDomain temporaryDomain = CreateTempAppDomain();

            try
            {
                string baseDirectory      = temporaryDomain.BaseDirectory;
                string assembly           = Assembly.GetExecutingAssembly().GetName().FullName;
                string type               = this.GetType().FullName;
                TemplateEngineProxy proxy = (TemplateEngineProxy)temporaryDomain.CreateInstanceAndUnwrap(assembly, type);
                proxy._Execute(templateInfo, host, settings);
            }
            finally
            {
                AppDomain.Unload(temporaryDomain);
            }
        }
Example #9
0
        internal TemplateContext(string relativePath, string templateDirectory, ITemplateGeneratorHost host)
        {
            _templateDirectory = templateDirectory;
            _relativePath      = relativePath;
            _host    = host;
            _context = new Hashtable();
            Hashtable globalContext = host.GetGlobalContext();

            if (globalContext != null)
            {
                foreach (DictionaryEntry entry in globalContext)
                {
                    _context.Add(entry.Key, entry.Value);
                }
            }
            _directives = new Hashtable();
            _imports    = new Hashtable();
            _assemblies = new Hashtable();
        }
Example #10
0
        private void ProcessTemplates(string relativePath, string srcDirectory, ITemplateGeneratorHost host)
        {
            //foreach(string file in Directory.GetFiles(srcDirectory, "*.config.template"))
            foreach (string file in Directory.GetFiles(srcDirectory))
            {
                if (Path.GetExtension(file).ToLower() == ".template")
                {
                    string outFileName = Path.GetFileName(file);
                    outFileName = outFileName.Substring(0, outFileName.Length - ".template".Length);

                    TemplateContext templateContext = new TemplateContext(relativePath, srcDirectory, host);
                    PushContext(templateContext);

                    ProcessTemplate(relativePath, file, outFileName, host);

                    PopContext();
                }
                else if (Path.GetExtension(file).ToLower() == ".subtemplate")
                {
                    //ignore subtemplates
                }
                else
                {
                    host.AddFile(relativePath, file);
                }
            }
            foreach (string dir in Directory.GetDirectories(srcDirectory))
            {
                DirectoryInfo info = new DirectoryInfo(dir);
                if (info.Name.StartsWith("_"))
                {
                    continue;                    //Ignore special folders
                }
                string relativePathTmp = Path.Combine(relativePath, info.Name);
                ProcessTemplates(relativePathTmp, dir, host);
            }
        }
Example #11
0
		private string InternalProcessTemplate(string relativePath, string templateFile, string outFileName, ITemplateGeneratorHost host)
		{
			string filename = Path.GetFileName(templateFile);
			log.Debug(string.Format("Internal processing template {0}", templateFile));

			_contentBuilder = new StringBuilder();
			_codeBuilder = new StringBuilder();
			//_directives = new Hashtable();
			//_imports = new Hashtable();
			//_assemblies = new Hashtable();
			using(StreamReader streamReader = new StreamReader(templateFile))
			{
				TemplateParser parser = new TemplateParser(templateFile, streamReader);
				try
				{
					parser.Error += new ParseErrorHandler(ParserError);
					parser.TagParsed += new TagParsedHandler(TagParsed);
					parser.TextParsed += new TextParsedHandler(TextParsed);
					parser.Parse();

					DumpContent();
				}
				catch(Exception ex)
				{
					log.Debug(string.Format("Template parser failed", ex));
				}
				finally
				{
					parser.Error -= new ParseErrorHandler(ParserError);
					parser.TagParsed -= new TagParsedHandler(TagParsed);
					parser.TextParsed -= new TextParsedHandler(TextParsed);
					parser = null;
				}
			}

			string result = Execute(host, relativePath, templateFile, outFileName);
			return result;
		}
Example #12
0
 public void Execute(TemplateInfo templateInfo, ITemplateGeneratorHost host)
 {
     Execute(templateInfo, host, TemplateEngineSettings.Default);
 }
Example #13
0
        private string Execute(ITemplateGeneratorHost host, string relativePath, string templateFile, string outFileName)
        {
            Type compiledType = null;

            if (!_compiledAssemblies.Contains(templateFile))
            {
                string guid = Guid.NewGuid().ToString("N");
                string generatorClassName = "Template" + guid;
                string import             = @"using System;
using System.Collections;
";

                foreach (DictionaryEntry entry in _currentTemplateContext.Imports)
                {
                    TagAttributes tagAttributes = entry.Value as TagAttributes;
                    import += "using " + tagAttributes["Namespace"].ToString() + ";\r\n";
                }

                string prefix = @"
namespace FluorineFx.CodeGenerator
{
	public class "     + generatorClassName + @" : Template
	{
		public "         + generatorClassName + @"(TemplateEngine templateEngine, ITemplateGeneratorHost host, TemplateContext templateContext) : base(templateEngine, host, templateContext)
		{
		}

		public void RunTemplate()
		{"        ;

                string suffix = @"
		}
	}
}";

                string code = import + prefix + _codeBuilder.ToString() + suffix;

                if (_templateEngineSettings.Trace)
                {
                    host.AddFile(relativePath, outFileName + ".trace.cs", code);
                }

                CodeDomProvider provider = null;
                //Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
                //Microsoft.VisualBasic.VBCodeProvider provider = new Microsoft.VisualBasic.VBCodeProvider();
                provider = new Microsoft.CSharp.CSharpCodeProvider();
#if (NET_1_1)
                ICodeCompiler compiler = provider.CreateCompiler();
#endif
                CompilerParameters options = new CompilerParameters();
                options.GenerateInMemory   = true;
                options.GenerateExecutable = false;
                foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
                {
                    //options.ReferencedAssemblies.Add(Path.GetFileName(assembly.Location));
                    options.ReferencedAssemblies.Add(assembly.Location);
                }

                Uri    uri     = new Uri(Assembly.GetExecutingAssembly().CodeBase);
                string libPath = Path.GetDirectoryName(uri.LocalPath);
                options.CompilerOptions = "/lib:\"" + libPath + "\"";
                if (AppDomain.CurrentDomain.BaseDirectory != null)
                {
                    options.CompilerOptions += " /lib:\"" + Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory) + "\"";
                }
                if (AppDomain.CurrentDomain.DynamicDirectory != null)
                {
                    options.CompilerOptions += " /lib:\"" + Path.GetDirectoryName(AppDomain.CurrentDomain.DynamicDirectory) + "\"";
                }

                foreach (DictionaryEntry entry in _currentTemplateContext.Assemblies)
                {
                    TagAttributes tagAttributes = entry.Value as TagAttributes;
                    bool          referenced    = false;
                    foreach (string referencedAssembly in options.ReferencedAssemblies)
                    {
                        string assembly = Path.GetFileName(referencedAssembly);
                        if (assembly.ToLower() == tagAttributes["Name"].ToString().ToLower())
                        {
                            referenced = true;
                            break;
                        }
                    }
                    if (!referenced)
                    {
                        options.ReferencedAssemblies.Add(tagAttributes["Name"].ToString());
                    }
                }

                //log.Debug("Compiling code");
                //log.Debug(code);

                /*
                 * string output = Path.Combine(Path.GetTempPath(), generatorClassName + ".cs");
                 * using (StreamWriter sw = File.CreateText(output))
                 * {
                 *  sw.Write(code);
                 * }
                 */

#if (NET_1_1)
                CompilerResults results = compiler.CompileAssemblyFromSource(options, code);
#else
                CompilerResults results = provider.CompileAssemblyFromSource(options, code);
                //CompilerResults results = provider.CompileAssemblyFromFile(options, output);
#endif
                if (results.Errors.Count != 0)
                {
                    StringBuilder errorBuilder = new StringBuilder();
                    errorBuilder.Append("*** Compilation Errors ***\n");
                    log.Error("*** Compilation Errors ***");
                    foreach (CompilerError error in results.Errors)
                    {
                        errorBuilder.Append(error.Line + ", " + error.Column + ", " + error.ErrorNumber + ": ");
                        errorBuilder.Append(error.ErrorText);
                        errorBuilder.Append("\r\n");
                        log.Error(error.Line + ", " + error.Column + ", " + error.ErrorNumber + ": " + error.ErrorText);
                    }
                    host.AddFile(relativePath, outFileName + ".error.txt", errorBuilder.ToString());
                    return(errorBuilder.ToString());
                }

                compiledType = results.CompiledAssembly.GetType("FluorineFx.CodeGenerator." + generatorClassName);
                _compiledAssemblies[templateFile] = compiledType;
            }
            else
            {
                compiledType = _compiledAssemblies[templateFile] as Type;
            }

            TextWriter   saved  = Console.Out;
            StringWriter writer = new StringWriter();
            Console.SetOut(writer);
            try
            {
                object     generator = Activator.CreateInstance(compiledType, new object[] { this, host, _currentTemplateContext });//Assembly.CreateInstance("FluorineFx.CodeGenerator." + generatorClassName, true, BindingFlags.Public | BindingFlags.Instance, null, new object[] { this, host, _currentTemplateContext }, null, null);
                MethodInfo mi        = generator.GetType().GetMethod("RunTemplate");
                mi.Invoke(generator, new object[] {});
                return(writer.ToString());
            }
            catch (Exception ex)
            {
                log.Error("Error calling code generator", ex);
                Console.SetOut(saved);
                //Console.WriteLine(code.ToString());
                Console.WriteLine();
                Console.WriteLine("Unable to invoke entry point: {0}", ex.Message);
                if (ex.InnerException != null)
                {
                    Console.WriteLine(ex.InnerException);
                }
                return(ex.ToString());
            }
            finally
            {
                Console.SetOut(saved);
            }
        }
Example #14
0
        private string InternalProcessTemplate(string relativePath, string templateFile, string outFileName, ITemplateGeneratorHost host)
        {
            string filename = Path.GetFileName(templateFile);

            log.Debug(string.Format("Internal processing template {0}", templateFile));

            _contentBuilder = new StringBuilder();
            _codeBuilder    = new StringBuilder();
            //_directives = new Hashtable();
            //_imports = new Hashtable();
            //_assemblies = new Hashtable();
            using (StreamReader streamReader = new StreamReader(templateFile))
            {
                TemplateParser parser = new TemplateParser(templateFile, streamReader);
                try
                {
                    parser.Error      += new ParseErrorHandler(ParserError);
                    parser.TagParsed  += new TagParsedHandler(TagParsed);
                    parser.TextParsed += new TextParsedHandler(TextParsed);
                    parser.Parse();

                    DumpContent();
                }
                catch (Exception ex)
                {
                    log.Debug(string.Format("Template parser failed", ex));
                }
                finally
                {
                    parser.Error      -= new ParseErrorHandler(ParserError);
                    parser.TagParsed  -= new TagParsedHandler(TagParsed);
                    parser.TextParsed -= new TextParsedHandler(TextParsed);
                    parser             = null;
                }
            }

            string result = Execute(host, relativePath, templateFile, outFileName);

            return(result);
        }
Example #15
0
        protected void ProcessTemplate(string relativePath, string templateFile, string outFileName, ITemplateGeneratorHost host)
        {
            string result = InternalProcessTemplate(relativePath, templateFile, outFileName, host);

            OutputType    outputType             = OutputType.Normal;
            TagAttributes codeTemplateAttributes = _currentTemplateContext.Directives["CodeTemplate"] as TagAttributes;

            if (codeTemplateAttributes != null)
            {
                string tmp = codeTemplateAttributes["OutputType"] as string;
                if (tmp != null)
                {
                    try
                    {
                        outputType = (OutputType)Enum.Parse(typeof(OutputType), tmp, true);
                    }
                    catch (ArgumentException) { }
                }
            }

            if (outputType == OutputType.Normal)
            {
                host.AddFile(relativePath, outFileName, result);
            }
        }
Example #16
0
		public string Preview(TemplateInfo templateInfo, ITemplateGeneratorHost host, TemplateEngineSettings templateEngineSettings)
		{
			ValidationUtils.ArgumentNotNull(templateInfo, "templateInfo");
			ValidationUtils.ArgumentNotNull(host, "host");
			ValidationUtils.ArgumentNotNull(templateEngineSettings, "templateEngineSettings");

			log.Debug(string.Format("Running template {0} from {1}", templateInfo.Name, templateInfo.Directory));
			string result;
			try
			{
				_templateEngineSettings = templateEngineSettings;
				string relativePath = "";
				string templateFile = Path.Combine(templateInfo.Directory, "preview.template");

				TemplateContext templateContext = new TemplateContext(relativePath, templateInfo.Directory, host);
				PushContext(templateContext);
				result = InternalProcessTemplate(relativePath, templateFile, "preview",  host);
				PopContext();
			}
			catch(Exception ex)
			{
				log.Error("Failed generating template preview", ex);
				throw ex;
			}
			//log.Debug(result);
			return result;
		}
		internal void _Execute(TemplateInfo templateInfo, ITemplateGeneratorHost host, TemplateEngineSettings settings)
		{
			StartLogging();
			ILog log = LogManager.GetLogger(typeof(TemplateEngineProxy));
			log.Debug(string.Format("Entering AppDomain: {0} {1}", AppDomain.CurrentDomain.FriendlyName, AppDomain.CurrentDomain.BaseDirectory));
			TemplateEngine templateEngine = new TemplateEngine();
			templateEngine.Execute(templateInfo, host, settings);
		}
		public string Preview(TemplateInfo templateInfo, ITemplateGeneratorHost host, TemplateEngineSettings settings)
		{
			AppDomain temporaryDomain = CreateTempAppDomain();
			try
			{
				string assembly = Assembly.GetExecutingAssembly().GetName().FullName;
				string type = this.GetType().FullName;
				log.Debug(string.Format("CreateInstanceAndUnwrap {0} {1}", assembly, type));
				TemplateEngineProxy proxy = (TemplateEngineProxy)temporaryDomain.CreateInstanceAndUnwrap(assembly, type);
				if( proxy == null )
				{
					string msg = string.Format("Failed to locate the requested  type {0}", type);
					log.Debug(msg);
					throw new ServiceBrowserException(msg);
				}
				else
				{
					string result = proxy._Preview(templateInfo, host, settings);
					//log.Debug(result);
					return result;
				}
			}
			finally
			{
				AppDomain.Unload(temporaryDomain);
			}
		}
Example #19
0
		protected void ProcessTemplate(string relativePath, string templateFile, string outFileName, ITemplateGeneratorHost host)
		{
			string result = InternalProcessTemplate(relativePath, templateFile, outFileName, host);

			OutputType outputType = OutputType.Normal;
			TagAttributes codeTemplateAttributes = _currentTemplateContext.Directives["CodeTemplate"] as TagAttributes;
			if( codeTemplateAttributes != null )
			{
				string tmp = codeTemplateAttributes["OutputType"] as string;
				if (tmp != null)
				{
					try 
					{
						outputType = (OutputType)Enum.Parse(typeof(OutputType), tmp, true);
					}
					catch(ArgumentException) { }
				}
			}

			if( outputType == OutputType.Normal )
			{
				host.AddFile(relativePath, outFileName, result);
			}
		}
Example #20
0
		private void ProcessTemplates(string relativePath, string srcDirectory, ITemplateGeneratorHost host)
		{
			//foreach(string file in Directory.GetFiles(srcDirectory, "*.config.template"))
			foreach(string file in Directory.GetFiles(srcDirectory))
			{
				if( Path.GetExtension(file).ToLower() == ".template" )
				{
					string outFileName = Path.GetFileName(file);
					outFileName = outFileName.Substring(0, outFileName.Length - ".template".Length);

					TemplateContext templateContext = new TemplateContext(relativePath, srcDirectory, host);
					PushContext(templateContext);

					ProcessTemplate(relativePath, file, outFileName, host);

					PopContext();
				}
				else if( Path.GetExtension(file).ToLower() == ".subtemplate" )
				{
					//ignore subtemplates
				}				
				else
				{
					host.AddFile(relativePath, file);
				}
			}
			foreach(string dir in Directory.GetDirectories(srcDirectory))
			{
				DirectoryInfo info = new DirectoryInfo(dir);
				if( info.Name.StartsWith("_") )
					continue;//Ignore special folders
				string relativePathTmp = Path.Combine(relativePath, info.Name);
				ProcessTemplates(relativePathTmp, dir, host);
			}
		}
		public void Execute(TemplateInfo templateInfo, ITemplateGeneratorHost host, TemplateEngineSettings settings)
		{
			AppDomain temporaryDomain = CreateTempAppDomain();
			try
			{
				string baseDirectory = temporaryDomain.BaseDirectory;
				string assembly = Assembly.GetExecutingAssembly().GetName().FullName;
				string type = this.GetType().FullName;
				TemplateEngineProxy proxy = (TemplateEngineProxy)temporaryDomain.CreateInstanceAndUnwrap(assembly, type);
				proxy._Execute(templateInfo, host, settings);
			}
			finally
			{
				AppDomain.Unload(temporaryDomain);
			}
		}
		internal string _Preview(TemplateInfo templateInfo, ITemplateGeneratorHost host, TemplateEngineSettings settings)
		{
			StartLogging();
			ILog log = LogManager.GetLogger(typeof(TemplateEngineProxy));
			log.Debug(string.Format("Entering AppDomain: {0} {1}", AppDomain.CurrentDomain.FriendlyName, AppDomain.CurrentDomain.BaseDirectory));
			TemplateEngine templateEngine = new TemplateEngine();
			ValidationUtils.ObjectNotNull(templateEngine, "templateEngine");
			return templateEngine.Preview(templateInfo, host, settings);
		}
Example #23
0
 public Template(TemplateEngine templateEngine, ITemplateGeneratorHost host, TemplateContext templateContext)
 {
     _templateEngine  = templateEngine;
     _host            = host;
     _templateContext = templateContext;
 }
Example #24
0
		private string Execute(ITemplateGeneratorHost host, string relativePath, string templateFile, string outFileName)
		{
            Type compiledType = null;
            if (!_compiledAssemblies.Contains(templateFile))
            {
                string guid = Guid.NewGuid().ToString("N");
                string generatorClassName = "Template" + guid;
                string import = @"using System;
using System.Collections;
";

                foreach (DictionaryEntry entry in _currentTemplateContext.Imports)
                {
                    TagAttributes tagAttributes = entry.Value as TagAttributes;
                    import += "using " + tagAttributes["Namespace"].ToString() + ";\r\n";
                }

                string prefix = @"
namespace FluorineFx.CodeGenerator
{
	public class " + generatorClassName + @" : Template
	{
		public " + generatorClassName + @"(TemplateEngine templateEngine, ITemplateGeneratorHost host, TemplateContext templateContext) : base(templateEngine, host, templateContext)
		{
		}

		public void RunTemplate()
		{";

                string suffix = @"
		}
	}
}";

                string code = import + prefix + _codeBuilder.ToString() + suffix;

                if (_templateEngineSettings.Trace)
                {
                    host.AddFile(relativePath, outFileName + ".trace.cs", code);
                }

                CodeDomProvider provider = null;
                //Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
                //Microsoft.VisualBasic.VBCodeProvider provider = new Microsoft.VisualBasic.VBCodeProvider();
                provider = new Microsoft.CSharp.CSharpCodeProvider();
#if (NET_1_1)
			ICodeCompiler compiler = provider.CreateCompiler();
#endif
                CompilerParameters options = new CompilerParameters();
                options.GenerateInMemory = true;
                options.GenerateExecutable = false;
                foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
                {
                    //options.ReferencedAssemblies.Add(Path.GetFileName(assembly.Location));
                    options.ReferencedAssemblies.Add(assembly.Location);
                }

                Uri uri = new Uri(Assembly.GetExecutingAssembly().CodeBase);
                string libPath = Path.GetDirectoryName(uri.LocalPath);
                options.CompilerOptions = "/lib:\"" + libPath + "\"";
                if (AppDomain.CurrentDomain.BaseDirectory != null)
                    options.CompilerOptions += " /lib:\"" + Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory) + "\"";
                if (AppDomain.CurrentDomain.DynamicDirectory != null)
                    options.CompilerOptions += " /lib:\"" + Path.GetDirectoryName(AppDomain.CurrentDomain.DynamicDirectory) + "\"";

                foreach (DictionaryEntry entry in _currentTemplateContext.Assemblies)
                {
                    TagAttributes tagAttributes = entry.Value as TagAttributes;
                    bool referenced = false;
                    foreach (string referencedAssembly in options.ReferencedAssemblies)
                    {
                        string assembly = Path.GetFileName(referencedAssembly);
                        if (assembly.ToLower() == tagAttributes["Name"].ToString().ToLower())
                        {
                            referenced = true;
                            break;
                        }
                    }
                    if (!referenced)
                        options.ReferencedAssemblies.Add(tagAttributes["Name"].ToString());
                }

                //log.Debug("Compiling code");
                //log.Debug(code);

                /*
                string output = Path.Combine(Path.GetTempPath(), generatorClassName + ".cs");
                using (StreamWriter sw = File.CreateText(output))
                {
                    sw.Write(code);
                }
                */

#if (NET_1_1)
			CompilerResults results = compiler.CompileAssemblyFromSource(options, code);
#else
                CompilerResults results = provider.CompileAssemblyFromSource(options, code);
                //CompilerResults results = provider.CompileAssemblyFromFile(options, output);
#endif
                if (results.Errors.Count != 0)
                {
                    StringBuilder errorBuilder = new StringBuilder();
                    errorBuilder.Append("*** Compilation Errors ***\n");
                    log.Error("*** Compilation Errors ***");
                    foreach (CompilerError error in results.Errors)
                    {
                        errorBuilder.Append(error.Line + ", " + error.Column + ", " + error.ErrorNumber + ": ");
                        errorBuilder.Append(error.ErrorText);
                        errorBuilder.Append("\r\n");
                        log.Error(error.Line + ", " + error.Column + ", " + error.ErrorNumber + ": " + error.ErrorText);
                    }
                    host.AddFile(relativePath, outFileName + ".error.txt", errorBuilder.ToString());
                    return errorBuilder.ToString();
                }

                compiledType = results.CompiledAssembly.GetType("FluorineFx.CodeGenerator." + generatorClassName);
                _compiledAssemblies[templateFile] = compiledType;
            }
            else
                compiledType = _compiledAssemblies[templateFile] as Type;

			TextWriter saved = Console.Out;
			StringWriter writer = new StringWriter();
			Console.SetOut(writer);
			try
			{
                object generator = Activator.CreateInstance(compiledType, new object[] { this, host, _currentTemplateContext });//Assembly.CreateInstance("FluorineFx.CodeGenerator." + generatorClassName, true, BindingFlags.Public | BindingFlags.Instance, null, new object[] { this, host, _currentTemplateContext }, null, null);
				MethodInfo mi = generator.GetType().GetMethod("RunTemplate");
				mi.Invoke(generator, new object[]{} );
				return writer.ToString();
			}
			catch (Exception ex)
			{
				log.Error("Error calling code generator", ex);
				Console.SetOut(saved);
				//Console.WriteLine(code.ToString());
				Console.WriteLine();
				Console.WriteLine("Unable to invoke entry point: {0}", ex.Message);
				if (ex.InnerException != null)
					Console.WriteLine(ex.InnerException);
				return ex.ToString();
			}
			finally
			{
				Console.SetOut(saved);
			}
		}
Example #25
0
		public Template(TemplateEngine templateEngine, ITemplateGeneratorHost host, TemplateContext templateContext)
		{
			_templateEngine = templateEngine;
			_host = host;
			_templateContext = templateContext;
		}
Example #26
0
		public void Execute(TemplateInfo templateInfo, ITemplateGeneratorHost host)
		{
			Execute(templateInfo, host, TemplateEngineSettings.Default);
		}