首页 > 代码库 > 《如何让TT T4模板输出多个文件(VS2010中)》-- access911.net 文章

《如何让TT T4模板输出多个文件(VS2010中)》-- access911.net 文章

《如何让TT T4模板输出多个文件(VS2010中)》-- access911.net 文章

 

问题:

  VS2010中自带的 TT 模板功能挺好用,但是如何定义其输出的目录,或者如何编程让一个tt文件可以输出多个结果文件。

 

 

回答:

 
<#@ Import Namespace="System.Text" #>
<#@ import namespace="System.IO" #>
<#@ Import Namespace="System.Reflection" #>

 


<#+
/// <summary>
/// 这个类主要用于重定义 TT t4 的输出位置,这样就可以在t4中动态定义其输出位置了。
/// </summary>
/// <remarks>
/// 如果要使用这个类,需要在项目中引用以下两个文件
/// C:\WINDOWS\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualStudio.TextTemplating.10.0\v4.0_10.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.TextTemplating.10.0.dll
/// C:\WINDOWS\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualStudio.TextTemplating.Interfaces.10.0\v4.0_10.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll
/// </remarks>
/// <example>
/// <#@ Include File="ClassFile.ttinclude" #>
/// using (new File(fullPath, this))
///    {
///     //这里写模板代码
/// }
/// </example>

   public class File : System.IDisposable
   {
      private string m_fileName;
      private string m_bufferContent;
      private StringBuilder m_textBuffer;

      /// <summary>
      /// 这里 TextTransformation textTransformation 一直提示 错误    5    未能找到类型或命名空间名称“TextTransformation”(是否缺少 using 指令或程序集引用?)    C:\xheditor-1.1.14\demo_ASP4\demo_ASP4\T4\ClassFile.ttinclude    22    33    
      /// 但是仍然能够正常运行,不知道为什么。
      /// 终于找到 Microsoft.VisualStudio.TextTemplating 类了,在 C:\WINDOWS\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualStudio.TextTemplating.10.0\v4.0_10.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.TextTemplating.10.0.dll 文件中。
      /// textTransformation 参数定义其类型为  GeneratedTextTransformation 或者  TextTransformation 都可以成功生成,因为它永远不可能与 tt 模板中随机生成的   名称空间.TextTransformation  对应上。
      /// 还需要引用 C:\WINDOWS\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualStudio.TextTemplating.Interfaces.10.0\v4.0_10.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll
      /// </summary>
      /// <param name="fileName"></param>
      /// <param name="textTransformation"></param>
      //public File(string fileName, GeneratedTextTransformation textTransformation)

      public File(string fileName, GeneratedTextTransformation textTransformation)
      {
                                                     
         string outputDir = null;
         //网上的原始代码如下;
         //PropertyInfo outputDirProp = textTransformation.GetType().GetProperty("OutputDirectory");
         //if (outputDirProp != null)
         //   outputDir = (string)outputDirProp.GetValue(textTransformation, null);
                                                     
         //m_fileName = (outputDir ?? "") + fileName;

         //父目录识别错误,所以干脆定义文件名包括目录名由父程序来完成
         m_fileName = fileName;
                                                                                                                                 

         PropertyInfo genEnvProp = textTransformation.GetType().GetProperty("GenerationEnvironment", BindingFlags.FlattenHierarchy|BindingFlags.NonPublic|BindingFlags.Instance);
         if (genEnvProp != null)
         {
            m_textBuffer = (StringBuilder)genEnvProp.GetValue(textTransformation, null);
            m_bufferContent = m_textBuffer.ToString();
            m_textBuffer.Remove(0, m_textBuffer.Length);
         }
         return;

      }

      #region IDisposable Members
      public void Dispose()
      {
         if (m_textBuffer != null)
         {
            using (StreamWriter streamWriter = new StreamWriter(m_fileName))
            {
               streamWriter.Write(m_textBuffer.ToString());
            }
            m_textBuffer.Remove(0, m_textBuffer.Length);
            m_textBuffer.Append(m_bufferContent);
         }
         return;
      }
      #endregion
   }


#>