使用与模板位于同一项目中的T4模板中的类型

Ben*_*ack 21 .net c# vb.net t4 code-generation

我正在研究我的第一个T4代码生成工具,为我的项目添加一些存储过程帮助程序代码.我已经创建了自定义类型(例如StoredProcedure,StoredProcedureParameter以帮助我生成代码,并在我的代码中包含了程序集和命名空间引用:

<#@ template debug="false" hostspecific="false" language="VB" #>
<#@ output extension=".generated.vb" #>
<#@ assembly name="$(TargetPath)" #>
<#@ import namespace="StoredProcCodeGenerator" #>
Run Code Online (Sandbox Code Playgroud)

这允许我在我的T4模板代码中使用我的自定义类型.但是,因为我的自定义类型与T4模板代码存在于同一个项目中,所以在运行模板代码而不重新启动Visual Studio时,我无法重新编译项目.这不是很有趣.

我读了一篇很棒的文章,通过使用T4工具箱解决了这个问题,但是它没有用.要么我执行VolatileAssembly指令错误,要么T4工具箱根本没有安装.我不确定工具箱是否正确安装(我在Win XP上使用VS 2010).

有什么方法可以解决这个问题?

Ben*_*ack 10

您需要删除以前的assembly引用,然后添加VolatileAssembly引用.如果您不assembly首先删除常规引用,则会在添加VolatileAssembly引用时收到已添加的错误.

<#@ template debug="false" hostspecific="false" language="VB" #>
<#@ output extension=".generated.vb" #>
Run Code Online (Sandbox Code Playgroud)

<#@ assembly name="$(TargetPath)" #>

<#@ VolatileAssembly processor="T4Toolbox.VolatileAssemblyProcessor" 
    name="$(TargetPath)" #>
<#@ import namespace="StoredProcCodeGenerator" #>  
Run Code Online (Sandbox Code Playgroud)

现在,您可以继续构建项目,并在T4模板中使用该项目中定义的类型.

  • 柯克,你也许在使用VS2008吗?2008年,我们从项目参考中引入了本地类型作为标准搜索.我们在2010年将其删除,以便您的T4世界与您实际构建的世界隔离开来.我们这样做是为了在模板中使用.Net 4.0时支持.Net 2.0或3.5项目. (2认同)