从自定义基类继承T4模板,未安装Visual Studio 2010 SDK

时间:2011-01-14 20:09:26

标签: visual-studio-2010 inheritance t4

我有一个T4模板系统 - 在运行时执行,而不是在编译时 - 它会在我的应用程序中生成许多类的骨架。所有这些模板都驻留在生成器工具中,该工具不时用于将新类预生成到目标应用程序中。该工具包含一个配置类,其属性参数化所有T4模板的输出。

最初配置类是静态类。但是,随着类生成器工具的增长,最好使其成为非静态的,而是为每次使用创建一个新实例。问题是如何将此实例传递给T4模板的实例。自然的方式似乎是从一个公共基础继承它们,这个公共基础将配置配置类实例。

问题是我的自定义T4基类继承的TextTransformation类位于一个程序集中(根据像this SO question这样的来源)不附带Visual Studio 2010.相反,它是在Visual Studio 2010 SDK中提供的。

VS2010生成的基类虽然本身没有祖先,但不是部分的,所以没有办法通过另一个部分声明“注入”自定义祖先。

因此问题是:有没有办法从自定义基类继承运行时执行的T4模板而无需安装Visual Studio 2010 SDK?

免责声明:我对T4不是很熟悉,所以对于如何解决问题我可能完全错了。因此,欢迎任何其他建筑建议,虽然我的目标不是创建一个超级架构的发电机 - 它只是一个帮助工具,对于偶尔的读者来说应该是简单易懂的。

2 个答案:

答案 0 :(得分:6)

解决方案实际上非常简单 - 基类可以作为T4模板本身实现并继承。像这样:

基本模板:

<#@ template language="C#" #>
<#+ 

    public Config Config { get; set; }

#>

继承模板:

<#@ template language="C#" inherits="BaseTemplate" #>
...
<#= Config.SomeProperty #>
...

实例化模板后,基本模板中声明的属性将提供给实际配置。

答案 1 :(得分:1)

包含基类的程序集确实随Visual Studio一起提供,但它安装在GAC中,没有引用程序集。 Visual Studio SDK只包含DLL的可引用版本。

因此,如果您在代码中创建新的基类,则需要VS SDK来构建该基类,而不是使用它。在rutime,将收集GAC中的版本。