将一个字节数组传递给T4模板代码到另一个相同类型的数组中

时间:2013-05-02 21:40:19

标签: c# t4

我正在使用T4Template和codeDOM使用以下代码创建程序集:

CompilerParameters Params = new CompilerParameters();
            Params.GenerateExecutable = true;
            Params.ReferencedAssemblies.Add("System.dll");
            Params.OutputAssembly = "myfile.exe";

            RuntimeTextTemplate1 RTT = new RuntimeTextTemplate1();
            string Source = RTT.TransformText();

            CompilerResults Create = new CSharpCodeProvider().CompileAssemblyFromSource(Params, Source);

模板看起来像这样(暂时):

<#@ template language="C#" #>
namespace Application
{
  class Program
  {
     static void Main()
     {
       byte[] buffer = new byte[1024];
       //And some code for creating a file with the bytes in the buffer.
     }
  }
}

在Main应用程序中,我有一个字节数组,其中包含某个应用程序的某些字节,这些字节在运行时被加载到数组中。

我的问题是:

  • 如何将包含数据(字节)的字节数组传递给 T4Template在(byte[] buffer = new byte[1024];)所以当 使用模板(数组)中编写的代码创建程序集 应该包含字节。

1 个答案:

答案 0 :(得分:0)

就个人而言,我更喜欢在运行时将数据传递给生成的代码,但是如果你真的需要将它嵌入到生成的程序集中,那么你可以这样做:

添加一个带有字节数组参数的类功能块作为其中的成员,然后您就可以从运行时模板中设置该功能块并在模板中访问它。类似于以下内容

<#@ template language="C#" #>
namespace Application
{
  class Program
  {
     static void Main()
     {
       byte[] buffer = new byte[1024] { <#= BufferValue.Select(b => "0x" + b.ToString("X2")).Aggregate((f, s) => f + ", " + s) #> };
       //And some code for creating a file with the bytes in the buffer.
     }
  }
}
<#+

public byte[] BufferValue { get; set; } 

#>

然后在调用模板之前将RTT.BufferValue设置为您的数组。