标签: t4

运行T4模板时确定解决方案配置(调试/发布)

我有一个T4模板,可以根据标志输出优化内容或标准内容.目前我正在根据我的需要手动更改旗帜.

我喜欢做的是根据Visual Studio中的解决方案配置来设置标志.如果设置为在调试模式下构建,我将输出标准内容.如果设置为在发布模式下构建,我会改为优化内容.我发现另一个看起来很有希望的T4问题:T4文本模板 - 是否有可能从主机获取编译符号?

但是,在我的情况下,我想做类似以下的事情:

<#@ template language="C#" hostspecific="True" 
    compilerOptions="/d:$(ConfigurationName)" #>
Run Code Online (Sandbox Code Playgroud)

因为我可以在程序集指令中使用$(SolutionDir):

<#@ assembly name="$(SolutionDir)\myreference.dll" #>
Run Code Online (Sandbox Code Playgroud)

我认为/ d:$(ConfigurationName)会让我到达我需要去的地方,然后我可以执行以下操作来设置我的标志:

<#
#if Debug 
 optimize = false;
#else 
 optimize = true;
#endif 
#>
Run Code Online (Sandbox Code Playgroud)

唉,这似乎不起作用.我也尝试过使用:

Host.ResolveParameterValue("-", "-", "ConfigurationName");
Run Code Online (Sandbox Code Playgroud)

也无济于事.有任何想法吗?

t4

24
推荐指数
2
解决办法
6029
查看次数

T4MVC错误 - T4文件被阻止或处于非受信任区域

我在Mac Book Pro上的Parallels Desktop 8内的Windows 7虚拟机上运行Visual Studio 2010.

我正在尝试将T4MVC合并到一个新的MVC4项目中.我从Nuget安装了T4MVC软件包并立即开始收到此错误...

无法解析文件的包含文本:路径'\ psf\Home ...\T4MVC.tt.hooks.t4'必须是此计算机的本地或受信任区域的一部分.如果您已下载此模板,则可能需要使用Windows资源管理器中模板文件的属性页面对其进行"取消阻止".

我进入了T4MVC.tt.hooks.t4文件的"属性"菜单,但是我找不到任何选项或按钮来取消阻止它.

我的假设是这个问题与我在虚拟机上运行的事实有关,因此我的项目文件不在受信任的位置.但我不知道如何解决这个问题.

我一直在寻找,但似乎无法找到任何答案.任何帮助,将不胜感激.

谢谢

.net asp.net-mvc t4 visual-studio-2010

23
推荐指数
2
解决办法
9816
查看次数

在运行时创建T4模板(构建时)?

我们正在构建一个内部应用程序,需要生成HTML文件以上传到eBay列表中.我们希望使用模板引擎根据我们预定义的数据库和静态字段生成HTML文件.模板还需要具有逻辑功能(if-then,foreach等).

我们已经看过T4并且它看起来很完美,但我们没有看到它是否具有在运行时使用的功能,因此用户可以创建T4模板,然后应用程序可以"编译"它并生成最终的HTML文件.这有可能,怎么样?

如果没有,是否还有其他我们应该关注的具有所有这些功能的框架?

.net c# t4 templates code-generation

22
推荐指数
3
解决办法
1万
查看次数

生成(通过T4)文件构建操作将重置为Build

我们在Visual Studio 2013中有一个数据库项目.在这个项目中,我们有一个生成.sql脚本的.tt文件.问题是在生成之后,生成的文件的构建操作自动设置为Build.如果我们手动将其更改为None,则会在重新生成(运行自定义工具)后重置为Build.

另一个奇怪的事情是,只有当.tt文件在数据库项目中并且在该项目的某个文件夹中(不在root中)时才会发生.如果.tt文件位于另一个项目(任何地方)或数据库项目的根目录中,则生成文件的构建操作在重新生成后不会更改.

我们没有任何Visual Studio加载项,我尝试禁用可能被禁用的所有扩展和更新.

如果需要,我会给你任何细节.

.net c# t4 visual-studio

22
推荐指数
1
解决办法
1723
查看次数

T4模板正在某些PC上生成额外的新行

在为实体框架使用T4类时,有几个开发人员为每个生成的行生成一个额外的新行.我想知道这是否是某种需要更改的设置,以便他们的T4生成的文件看起来像其他开发人员生成的文件.作为我所谈论的一个例子:(删除了特定的名称,但你应该能够看到从同一个*.tt文件生成的新行数量的差异.)

(更新:问题也出现在其他T4模板中,而不仅仅是EF.两台PC都使用TextTemplatingFileGenerator作为T4自定义工具.)

我电脑的T4输出:

    public virtual DbSet<GeneratedObject1> GeneratedObject1 { get; set; }
    public virtual DbSet<GeneratedObject2> GeneratedObject2 { get; set; }

    public virtual int SomeMethod1(Nullable<int> inParameter)
    {
        var localParameter = inParameter.HasValue ?
            new ObjectParameter("SomePropertyName", inParameter) :
            new ObjectParameter("SomePropertyName", typeof(int));

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("SomeMethod1", localParameter);
    }

    public virtual int SomeMethod2(Nullable<int> inParameter)
    {
        var localParameter = inParameter.HasValue ?
            new ObjectParameter("SomePropertyName", inParameter) :
            new ObjectParameter("SomePropertyName", typeof(int));

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("SomeMethod2", localParameter);
    }
Run Code Online (Sandbox Code Playgroud)

PC的T4输出:

public virtual DbSet<GeneratedObject1> GeneratedObject1 { get; set; }

public virtual DbSet<GeneratedObject2> GeneratedObject2 …
Run Code Online (Sandbox Code Playgroud)

c# t4

22
推荐指数
1
解决办法
1666
查看次数

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

我正在研究我的第一个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).

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

.net c# vb.net t4 code-generation

21
推荐指数
1
解决办法
8418
查看次数

如何禁用写入T4生成输出文件的#line指令

我的T4代码生成遇到了一个小问题.

我已将我的T4模板分解为单独的文件并将它们放在各种目录中,我已经这样做了,因此我的代码生成的一部分可以在多个项目中重复使用,例如模型生成,存储库生成和服务生成都包括核心EntityGeneration .tt文件.

不幸的是,当TextTemplating解析我的嵌套包含时,它会在其生成的.cs文件中构建一个长的#line预处理器指令,将所有相对路径组合到最低级别的包含文件.

不幸的是,由于这条路径是用相对路径构建的,所以它最终会不必要地长,实际上它超过了最大路径长度(Windows 7).

如果您感兴趣,以下是生成代码的错误行:

#line 3 "C:\VS2010\AlbatrossTravelGroup\ASC\AlbatrossTravelGroup.ASC.BusinessRules\Services\Contracts\..\..\..\..\AlbatrossTravelGroup.BusinessRules\Services\Contracts\..\..\..\AlbatrossTravelGroup.Models\Repositories\Contracts\..\..\../AlbatrossTravelGroup.Common/CodeGeneration.tt"
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何禁用这些指令写入生成的代码文件?如果不这样做,如何在不更改文件结构的情况下避免此问题?

c# t4 path c-preprocessor

19
推荐指数
1
解决办法
1809
查看次数

T4模板 - 避免包含文件中的空行

我在单独的文件中拆分T4代码以实现模块化和重用,但我发现每个文件在输出中都是空行.例如:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".ttinclude" #>
<#@ Import Namespace="System.Collections.Generic" #>
<#@ Include file="Includes.tt" #>
namespace <#= NameSpace #>
{
Run Code Online (Sandbox Code Playgroud)

如果Includes.tt列出了3个其他*.tt文件,我在命名空间前得到3个空行.当我添加代码并将其拆分为单独的*.tt文件时,这个空白空间不断增长.事实上,我将所有包含文件打包到一个Includes.tt中,希望这只花费我一行空.它没有.我仍然在Includes.tt中列出的每个文件中得到一个空行.有没有办法避免这种情况?

编辑:假设我不是一个愚蠢的错误(我真诚地希望我是),问题并不像第一眼看上去那么微不足道:

a)通过包含的T4文件重用和模块化与T4本身一样古老,并在最新的MSDN杂志文章中提到:"在T4代码生成解决方案中管理复杂性".

b)如果代码是自动生成的,那并不意味着它的格式错误或清晰度差.

c)使用当前的解决方案,在我的情况下,对于每个生成的.cs文件,读者必须滚动一个空页面,直到她开始看到一些生成的文本.所有这些都是因为我在多个包含的.tt文件之间分割了我的代码.这似乎不对.

t4

19
推荐指数
5
解决办法
6318
查看次数

T4模板生成枚举

我正在寻找创建一个T4模板来生成我的数据库的枚举.本质上,我想要与SubSonic相同的功能,例如Linq-to-SQL或Entity Framework 4的Product.Columns.ProductId.

任何帮助将非常感激.谢谢.

t4 linq-to-sql

18
推荐指数
1
解决办法
7403
查看次数

如何生成我的所有实体通过T4自动化为每个实体组成两个表

我有一个使用Entity Framework 4的数据访问层的类库项目.我的项目需要一个版本控制概念.我的数据库包含许多包含«Id»和«CreationDateTime»的表.每个表都与包含详细信息的版本表相关联.所有表格都以相同的方式构造,并以版本表的"版本"为后缀.

我通过T4自动化搜索生成所有实体(EF4模型)的方法,该自动化将统一表和TableVersion(针对指定版本)放在一个实体中.

此统一实体必须支持获取,插入,更新和删除操作.

是否可以通过修改其中一个T4模板来完成?如果是的话,怎么样?

非常感谢任何指针.

.net c# t4 linq-to-entities entity-framework

18
推荐指数
1
解决办法
532
查看次数