What's new in T4 in Visual Studio 2010

OK, Visual Studio 2010 is well and truly released, so I thought I'd better catalog what goodness is in the box for all you T4 fans out there..


For template authors:

  • Preprocessed templates to allow embedding of template-based generation in arbitrary applications without a runtime T4 dependency. There is a new custom tool, new service APIs and new engine APIs to support this feature.
  • Runtime error handling is improved, with better handling of null expression blocks and fewer exceptions being eaten.
  • Include directives and Assembly directives now support both Windows environment variables and VS Macro variables.
  • Include directives and Assembly directives now resolved from VSIX Visual Studio extensions downloaded from VS gallery.
  • Include directives are now also resolved relative to the file that they are declared in to support libraries with relative includes.
  • Templates always use C#/VB 4.0 and .Net 4.0 types - language version is no longer needed.
  • Project/Add item templates for C# and VB and Web projects for both regular and preprocessed templates.
  • T4 now works in Web Site projects.
  • Generate All Files only runs the T4 custom tools in your project, not arbitrary ones like WPF.
  • The service tag project stamp is no longer written willy-nilly by T4.
  • New CompilerOptions flag to the template directive allows arbitrary flags to be sent to the template compiler, allowing optionstrict, optioninfer, optionexplicit etc. to be set for VB.
  • VS's Custom Tool Namespace is available in CallContext with the tag "NamespaceHint".
  • Templates no longer support the neutral culture, rather they always go to the invariant culture.
  • T4-MsBuild to transform your templates at build time.
  • The parser requires that templates with a class feature block finish with a class feature block to avoid boilerplate write statements hanging free at the end of the class causing hard-to-debug errors.
  • T4's assembly set is completely separated from the containing project's assembly set to avoid picking up the wrong assemblies when a project targets previous framework versions. Project assemblies are no longer used to resolve template assembly directives.
  • Assembly references will resolve from Visual Studio's PublicAssemblies folder.
  • WindowsBase.dll automatically referenced from templates.
  • Ability to use VS MEF components in the T4 AppDomain - also new CompositionServices helper class to make setting this up simple.
  • The options page is fully localized.
  • Better error messages when templates are included from internet zones or downloaded templates are included.
  • The Generate All Files button is disabled while a build is in progress so there aren't any clashes.

For custom tool builders:

  • Hosts can implement ITextTemplatingSessionHost to signal to the engine that they can provide a dictionary of arbitrary user data for the lifetime of the processing session. The data is accessed via a new Session property on the TextTransformation base class.
  • The built-in VS host implements ITextTemplatingSessionHost and provides a default session implementation to pass data from custom tools into templates while they run in the secondary appdomain, including resolving any necessary assemblies.
  • New "Parameter" directive with Name and Type properties, similar to the one in the GAX host. This allows custom tools to pass data to templates in a standard way.  It resolves from the Session dictionary, the Host via ResolveParameterValue or the CallContext.
  • T4 interfaces have been split out into a separate assembly to facilitate longer term versioning without taking a dependency on T4's implementation assemblies.
  • RequiresProvidesDirectiveProcessor uses a new order for processing required parameters to support richer overriding.
  • BaseCodeGeneratorWithSite now exposes both GlobalServiceProvider and SiteServiceProvider members.
  • New base class BaseTemplatedCodeGenerator makes it even simpler to create a T4-based custom tool with one override.
  • ProvideCodeGeneratorExtension attribute makes it easy to hook up custom tools to the web site project system.
  • Public access to the CacheAssembliesOptionsString in the Engine class to help control caching without magic strings.
  • Directive Processors support IRecognizeHostSpecific interface to participate in decisions around forcing this flag on.
  • The correct system implementation of IVsSingleFileGenerator is used rather than a T4 internal one.
  • Access to the internals of the Visual Studio built-in host via ITextTemplatingComponents service interface.

For DSL Tools users:

  • ModelBus support in templates.


Phew, that's a long list - you can see that Visual Studio 2010 is a big release for T4.

I'll come back and edit this post to include live links as I fill in more details about some of these topics.


Technorati Tags: T4,Visual Studio 2010,What's New,Text Templating