1.引用以下两个dll
实现ITextTemplatingEngineHost, ITextTemplatingSessionHost接口
[Serializable]
public class CustomEngineHost : ITextTemplatingEngineHost, ITextTemplatingSessionHost
{
#region ITextTemplatingEngineHost
internal string TemplateFileValue;
public string TemplateFile
{
get { return TemplateFileValue; }
}
private string fileExtensionValue = ".txt";
public string FileExtension
{
get { return fileExtensionValue; }
}
private Encoding fileEncodingValue = Encoding.UTF8;
public Encoding FileEncoding
{
get { return fileEncodingValue; }
}
private CompilerErrorCollection errorsValue;
public CompilerErrorCollection Errors
{
get { return errorsValue; }
}
public IList<string> StandardAssemblyReferences
{
get
{
return new string[]
{
typeof(System.Uri).Assembly.Location
};
}
}
public IList<string> StandardImports
{
get
{
return new string[]
{
//"System"
};
}
}
public bool LoadIncludeText(string requestFileName, out string content, out string location)
{
content = System.String.Empty;
location = System.String.Empty;
if (File.Exists(requestFileName))
{
content = File.ReadAllText(requestFileName);
return true;
}
else
{
return false;
}
}
public object GetHostOption(string optionName)
{
object returnObject;
switch (optionName)
{
case "CacheAssemblies":
returnObject = true;
break;
default:
returnObject = null;
break;
}
return returnObject;
}
public string ResolveAssemblyReference(string assemblyReference)
{
//if (File.Exists(assemblyReference))
//{
// return assemblyReference;
//}
string candidate = Path.Combine(ApplicationEnvironments.Current.Server.MapPath("~/bin/"), assemblyReference);
//if (assemblyReference.IndexOf("Microsoft.VisualStudio.TextTemplating.Interfaces.10.0") != -1)
//{
// candidate = ApplicationEnvironments.Current.Server.MapPath("~/bin/") + "Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll";
//}
if (File.Exists(candidate))
{
return candidate;
}
return "";
}
public Type ResolveDirectiveProcessor(string processorName)
{
if (string.Compare(processorName, "XYZ", StringComparison.OrdinalIgnoreCase) == 0)
{
//return typeof();
}
throw new Exception("Directive Processor not found");
}
public string ResolvePath(string fileName)
{
if (fileName == null)
{
throw new ArgumentNullException("the file name cannot be null");
}
if (File.Exists(fileName))
{
return fileName;
}
string candidate = Path.Combine(Path.GetDirectoryName(this.TemplateFile), fileName);
if (File.Exists(candidate))
{
return candidate;
}
return fileName;
}
public string ResolveParameterValue(string directiveId, string processorName, string parameterName)
{
if (directiveId == null)
{
throw new ArgumentNullException("the directiveId cannot be null");
}
if (processorName == null)
{
throw new ArgumentNullException("the processorName cannot be null");
}
if (parameterName == null)
{
throw new ArgumentNullException("the parameterName cannot be null");
}
return String.Empty;
}
public void SetFileExtension(string extension)
{
fileExtensionValue = extension;
}
public void SetOutputEncoding(System.Text.Encoding encoding, bool fromOutputDirective)
{
fileEncodingValue = encoding;
}
public void LogErrors(CompilerErrorCollection errors)
{
errorsValue = errors;
}
public AppDomain ProvideTemplatingAppDomain(string content)
{
//CreateDomain("Generation App Domain")
return AppDomain.CurrentDomain;
}
#endregion
#region ITextTemplatingSessionHost
public ITextTemplatingSession CreateSession()
{
return Session;
}
public ITextTemplatingSession Session
{
get;
set;
}
#endregion
}
以下是调用代码
public static string Create(TemplateModel templateModel, string templatePath,ref string strError)
{
if (string.IsNullOrWhiteSpace(templatePath))
{
return "";
}
try
{
templatePath = ApplicationEnvironments.Current.Server.MapPath(templatePath);
}
catch (Exception ex)
{
strError = ex.Message;
return null;
}
if (!File.Exists(templatePath))
{
strError = "未找到Entity.tt,请修改配置文件!";
return null;
}
CustomEngineHost host = new CustomEngineHost();
host.TemplateFileValue = templatePath;
string input = File.ReadAllText(templatePath);
host.Session = new TextTemplatingSession();
host.Session.Add("entity", templateModel);
//host.Session.Add("entity", templateModel.ToJson());
string output = new Engine().ProcessTemplate(input, host);
StringBuilder errorWarn = new StringBuilder();
foreach (CompilerError error in host.Errors)
{
errorWarn.Append(error.Line).Append(":").AppendLine(error.ErrorText);
}
if (!string.IsNullOrWhiteSpace(errorWarn.ToString()))
{
output = errorWarn.ToString();
}
//if (!File.Exists("Error.log"))
//{
// File.Create("Error.log");
//}
// File.WriteAllText("Error.log", errorWarn.ToString());
return output;
}
T4模版样例
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".txt" #>
<#@ assembly name="System.Data.dll" #>
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="WHLORM.dll" #>
<#@ assembly name="WHLORM.Core.dll" #>
<#@ assembly name="WHLORM.Model.dll" #>
<#@ assembly name="WHLORM.BLL.dll" #>
<#@ assembly name="WHLORM.DataBase.Model.dll" #>
<#@ assembly name="WHLORM.Web.dll" #>
<#@ Import namespace="System" #>
<#@ Import namespace="WHLORM.DataBase.BLL" #>
<#@ parameter type="WHLORM.DataBase.BLL.TemplateModel" name="entity" #>
下面就是你的内容 模版下引用使用linq 不知道为什么