您好,
我正试图通过sharpdevelop(主动记录方法)获得亚音速来赢得SQLite
我在使用T4模板生成代码时遇到了一些问题。
它抛出此错误: 帮助程序后不允许使用块 - SQLiteTest.tt
如果我删除了
<#@ include file="SQLite.ttinclude" #>
行
它不再抛出错误,但当然它不起作用。
错误必须位于 SQLite.ttinclude 或 Settings.ttinclude 中的某处 我查看了ttinclude文件,但我不知道是什么块或帮助器。
您是否知道可能导致错误的原因是什么? 显然,单色开发T4生成器会抛出相同的错误,但不会引发Visual Studio的错误。
答案 0 :(得分:3)
有点难以说出Helper / Block的含义,因为Visual Studio T4将不同的段称为Statement,Expression,BoilerPlate和ClassFeature IIRC。
在检查Mono T4的source code时,我会猜测Block引用语句,Helpers引用ClassFeatures。
T4示例:
<# // This is a Statement #>
<#+ // This is a ClassFeature #>
确实,语句不能出现在T4中的ClassFeatures下面,但我在想的是Visual Studio T4对ttinclude文件进行“智能”合并。 Mono T4可能没有。
了解为什么要考虑这两个T4文件。
示例T4.ttinclude:
<# // 1. This is a Statement #>
<#+ // 1. This is a ClassFeature #>
示例T4.tt
<# // 2. This is a Statement #>
<#+ // 2. This is a ClassFeature #>
<#@ include file="T4.ttinclude" #>
直接实现include只会合并文件:
<# // 2. This is a Statement #>
<#+ // 2. This is a ClassFeature #>
<# // 1. This is a Statement #>
<#+ // 1. This is a ClassFeature #>
但这是一个非法的T4模板,所以Visual Studio T4(据我所知)将文件合并到这是合法的:
<# // 1. This is a Statement #>
<# // 2. This is a Statement #>
<#+ // 1. This is a ClassFeature #>
<#+ // 2. This is a ClassFeature #>
因此,如果允许我猜测Mono T4是否包含使用简单方法的文件,但SubSonic模板是针对Visual Studio T4设计的,它使用稍微更精确的包含策略。
如果这是您需要的原因
我担心这两个消息都不是好消息。
PS。在阅读Mono代码时,开发人员似乎认为:
//TODO: are blocks permitted after helpers?
throw new ParserException ("Blocks are not permitted after helpers", seg.StartLocation);
答案 1 :(得分:1)
我也遇到了这个问题,但解决方案很简单。
移动&lt;#@ include file =“SQLServer.ttinclude”#&gt;声明到每个.tt文件的末尾。幸运的是,每个ttinclude文件只包含classFeatures
然后你需要重构一些依赖于EvnDTE的功能(单声道中不存在)。这很简单,因为这些函数只返回项目路径。这些函数是GetProjectPath,GetConfigPath和GetDataDirectory。我只是重写了这些以返回在文件头部声明的Consts。不像自动检测那么优雅,但足够简单管理。
完成这两件事之后,我能够成功运行Subsonic T4模板。
答案 2 :(得分:1)
现在应该在SharpDevelop 4.2中修复此问题。现在支持通过包含其他T4文件添加的类功能块。 SharpDevelop现在还从T4模板主机公开了自己的Visual Studio对象模型实现。 Subsonic模板使用Visual Studio对象模型来确定数据库连接字符串。
要使Subsonic模板正常工作,您需要对Settings.include文件进行两处修改:
替换对Visual Studio对象模型程序集(EnvDTE)的引用:
<#@ assembly name="EnvDTE" #>
使用:
<#@ assembly name="$(addinpath:ICSharpCode.PackageManagement)PackageManagement.dll" #>
为EnvDTE添加带有命名空间别名的import指令:
<#@ import namespace="EnvDTE = ICSharpCode.PackageManagement.EnvDTE" #>
保存这些更改,然后保存ActiveRecord.tt文件以生成数据库访问代码。