diff --git a/Mono.TextTemplating.Build/Mono.TextTemplating.Build.csproj b/Mono.TextTemplating.Build/Mono.TextTemplating.Build.csproj index 81b90d2..9206ade 100644 --- a/Mono.TextTemplating.Build/Mono.TextTemplating.Build.csproj +++ b/Mono.TextTemplating.Build/Mono.TextTemplating.Build.csproj @@ -33,6 +33,7 @@ + diff --git a/Mono.TextTemplating.Build/T4.BuildTools.targets b/Mono.TextTemplating.Build/T4.BuildTools.targets index 3839b1b..d8c9283 100644 --- a/Mono.TextTemplating.Build/T4.BuildTools.targets +++ b/Mono.TextTemplating.Build/T4.BuildTools.targets @@ -11,6 +11,7 @@ False False true + false $(PreprocessTemplateDefaultNamespace) $(RootNamespace) @@ -92,6 +93,7 @@ IntermediateDirectory="$(_T4IntermediateTemplateOutputDir)" TransformOutOfDateOnly="$(TransformOutOfDateOnly)" PreprocessTargetRuntimeIdentifier="$(TargetFrameworkIdentifier)" + UseInProcessCompiler="$(T4UseInProcessCompiler)" > diff --git a/Mono.TextTemplating.Build/T4.BuildTools.targets.buildschema.json b/Mono.TextTemplating.Build/T4.BuildTools.targets.buildschema.json index cc8b4ad..16010ef 100644 --- a/Mono.TextTemplating.Build/T4.BuildTools.targets.buildschema.json +++ b/Mono.TextTemplating.Build/T4.BuildTools.targets.buildschema.json @@ -140,6 +140,11 @@ "description": "Place preprocessed templates beside the templates instead of dynamically injecting them into the build.", "type": "bool" }, + "T4UseInProcessCompiler": { + "description": "Use the in-process Roslyn compiler for T4 templates, enabling modern C# language features even when running under Visual Studio's .NET Framework MSBuild host.", + "type": "bool", + "defaultValue": "false" + }, "T4Arguments": { "description": "Used to pass arguments when invoking on the CLI. This is a semicolon-separated list and uses the same format as encoded `T4Argument` items: `name=value`, `directive!name!value` or `processor!directive!name!value`.", "isList": true diff --git a/Mono.TextTemplating.Build/TemplateBuildState.cs b/Mono.TextTemplating.Build/TemplateBuildState.cs index 6a2a1ab..b0ca6cc 100644 --- a/Mono.TextTemplating.Build/TemplateBuildState.cs +++ b/Mono.TextTemplating.Build/TemplateBuildState.cs @@ -41,6 +41,8 @@ public class TemplateBuildState public List Parameters { get; set; } [Key(10)] public string PreprocessTargetRuntimeIdentifier { get; set; } + [Key(11)] + public bool UseInProcessCompiler { get; set; } internal (List transforms, List preprocessed) GetStaleAndNewTemplates ( TemplateBuildState previousBuildState, bool preprocessOnly, Func getFileWriteTime, TaskLoggingHelper logger) diff --git a/Mono.TextTemplating.Build/TextTransform.cs b/Mono.TextTemplating.Build/TextTransform.cs index 79a4e02..3ee1160 100644 --- a/Mono.TextTemplating.Build/TextTransform.cs +++ b/Mono.TextTemplating.Build/TextTransform.cs @@ -34,6 +34,7 @@ public TextTransform () : base (Messages.ResourceManager) { } public bool PreprocessOnly { get; set; } public bool UseLegacyPreprocessingMode { get; set; } public bool TransformOutOfDateOnly { get; set; } + public bool UseInProcessCompiler { get; set; } public string PreprocessTargetRuntimeIdentifier { get; set; } @@ -74,7 +75,8 @@ public override bool Execute () var buildState = new TemplateBuildState { IntermediateDirectory = IntermediateDirectory, DefaultNamespace = DefaultNamespace, - PreprocessTargetRuntimeIdentifier = PreprocessTargetRuntimeIdentifier + PreprocessTargetRuntimeIdentifier = PreprocessTargetRuntimeIdentifier, + UseInProcessCompiler = UseInProcessCompiler }; success &= AddParameters (buildState); diff --git a/Mono.TextTemplating.Build/TextTransformProcessor.cs b/Mono.TextTemplating.Build/TextTransformProcessor.cs index 3854cd2..40b93cc 100644 --- a/Mono.TextTemplating.Build/TextTransformProcessor.cs +++ b/Mono.TextTemplating.Build/TextTransformProcessor.cs @@ -13,6 +13,8 @@ using Microsoft.Build.Utilities; using Microsoft.VisualStudio.TextTemplating; +using Mono.TextTemplating; + namespace Mono.TextTemplating.Build { static class TextTransformProcessor @@ -191,6 +193,9 @@ static void WriteOutput (MSBuildTemplateGenerator generator, string outputFile, static MSBuildTemplateGenerator CreateGenerator (TemplateBuildState buildState) { var generator = new MSBuildTemplateGenerator (); + if (buildState.UseInProcessCompiler) { + generator.UseInProcessCompiler (); + } if (buildState.ReferencePaths != null) { generator.ReferencePaths.AddRange (buildState.ReferencePaths); }