T4模板可以使用相同的库

时间:2009-04-30 06:21:47

标签: c# visual-studio t4 texttemplate

我有一个定义类

的库
namespace ClassLibrary1
{
    public class Class1
    {
        public static readonly int Rate = 5;
    }
}

在同一个lib中我添加了一个tt文件

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#@ import namespace="ClassLibrary1" #>
<#@ assembly name="ClassLibrary.dll" #>

enum  MilkRate{ Walmart=<#= Class1.Rate #>}

我收到错误“编译转换:无法找到元数据文件'ClassLibrary.dll'd:\ documents \ visual studio 10 \ Projects \ ConsoleApplication2 \ ClassLibrary1 \ TextTemplate1.tt”

如何解决这个问题?

[在VS 2010,VS2008上发生]

3 个答案:

答案 0 :(得分:1)

我不确定这是否可行。

我认为我可能遇到的问题是:您的模板生成的代码会更改它引用的dll!

您可以做的一件事是使用以下模板引用另一个模板:

<#@ include file="Helper.tt" #>

通过这种方式,您可以在一个中央模板中定义Rate = 5,并让其他所有内容参考。您甚至可以构建一个模板来生成Class1类,以便将所有内容保存在一个中心位置。

我知道这并没有直接回答你的问题,但我希望它有用。

答案 1 :(得分:1)

你可以做到这一点,但这种“递归”工作方式存在问题需要小心。

在VS2010中,您可以在&lt;#@ assembly#&gt;中使用VS宏变量,$(SolutionDir),$(ProjectDir)和朋友。指令,例如

&lt;#@ assembly name =“$(ProjectDir)$(OutDir)ClassLibrary.dll”#&gt;

如果你有一个开发人员从源代码​​控制中做一个干净的获取,他们必须先做一个构建才能进行工作转换。

如果他们先变换,变换将失败,然后他们的构建将失败并且他们将被卡住并且必须恢复文件。这没什么大不了的,但它可以绊倒。

答案 2 :(得分:0)

您是否尝试过http://social.msdn.microsoft.com/Forums/en-US/vsx/threads上的VS Extensibility论坛?