diff --git a/Mono.TextTemplating.Build/Messages.resx b/Mono.TextTemplating.Build/Messages.resx
index 14e8328..a7213a0 100644
--- a/Mono.TextTemplating.Build/Messages.resx
+++ b/Mono.TextTemplating.Build/Messages.resx
@@ -193,4 +193,7 @@
Skipping transform template '{0}': output '{1}' is up to date
+
+ Regenerating all preprocessed templates: target runtime has changed from '{0}' to '{1}'
+
\ No newline at end of file
diff --git a/Mono.TextTemplating.Build/T4.BuildTools.targets b/Mono.TextTemplating.Build/T4.BuildTools.targets
index 65e6336..3839b1b 100644
--- a/Mono.TextTemplating.Build/T4.BuildTools.targets
+++ b/Mono.TextTemplating.Build/T4.BuildTools.targets
@@ -91,6 +91,7 @@
UseLegacyPreprocessingMode="$(UseLegacyT4Preprocessing)"
IntermediateDirectory="$(_T4IntermediateTemplateOutputDir)"
TransformOutOfDateOnly="$(TransformOutOfDateOnly)"
+ PreprocessTargetRuntimeIdentifier="$(TargetFrameworkIdentifier)"
>
diff --git a/Mono.TextTemplating.Build/TemplateBuildState.cs b/Mono.TextTemplating.Build/TemplateBuildState.cs
index c042afd..6a2a1ab 100644
--- a/Mono.TextTemplating.Build/TemplateBuildState.cs
+++ b/Mono.TextTemplating.Build/TemplateBuildState.cs
@@ -17,7 +17,7 @@ namespace Mono.TextTemplating.Build
[MessagePackObject]
public class TemplateBuildState
{
- public const int CurrentFormatVersion = 0;
+ public const int CurrentFormatVersion = 1;
[Key (0)]
public int FormatVersion { get; set; } = CurrentFormatVersion;
@@ -39,6 +39,8 @@ public class TemplateBuildState
public List TransformTemplates { get; set; }
[Key (9)]
public List Parameters { get; set; }
+ [Key(10)]
+ public string PreprocessTargetRuntimeIdentifier { get; set; }
internal (List transforms, List preprocessed) GetStaleAndNewTemplates (
TemplateBuildState previousBuildState, bool preprocessOnly, Func getFileWriteTime, TaskLoggingHelper logger)
@@ -105,6 +107,7 @@ public class TemplateBuildState
{
(bool, bool) regenAll = (true, true);
(bool, bool) regenTransforms = (true, false);
+ (bool, bool) regenPreprocessed = (false, true);
if (lastSession == null) {
return regenAll;
@@ -115,6 +118,11 @@ public class TemplateBuildState
return regenAll;
}
+ if (lastSession.PreprocessTargetRuntimeIdentifier != session.PreprocessTargetRuntimeIdentifier) {
+ logger.LogMessageFromResources (MessageImportance.Low, nameof (Messages.RegeneratingAllPreprocessedTargetRuntimeChanged), lastSession.PreprocessTargetRuntimeIdentifier, session.PreprocessTargetRuntimeIdentifier);
+ return regenPreprocessed;
+ }
+
// this is probably impossible as the previous session is loaded from the intermediate directory, but let's be safe
if (lastSession.IntermediateDirectory != session.IntermediateDirectory) {
logger.LogMessageFromResources (MessageImportance.Low, nameof(Messages.RegeneratingAllIntermediateDirChanged));
diff --git a/Mono.TextTemplating.Build/TextTransform.cs b/Mono.TextTemplating.Build/TextTransform.cs
index 65e5e9e..32558e4 100644
--- a/Mono.TextTemplating.Build/TextTransform.cs
+++ b/Mono.TextTemplating.Build/TextTransform.cs
@@ -35,6 +35,8 @@ public TextTransform () : base (Messages.ResourceManager) { }
public bool UseLegacyPreprocessingMode { get; set; }
public bool TransformOutOfDateOnly { get; set; }
+ public string PreprocessTargetRuntimeIdentifier { get; set; }
+
[Required]
public string IntermediateDirectory { get; set; }
@@ -71,7 +73,8 @@ public override bool Execute ()
var buildState = new TemplateBuildState {
IntermediateDirectory = IntermediateDirectory,
- DefaultNamespace = DefaultNamespace
+ DefaultNamespace = DefaultNamespace,
+ PreprocessTargetRuntimeIdentifier = PreprocessTargetRuntimeIdentifier
};
success &= AddParameters (buildState);
diff --git a/Mono.TextTemplating.Build/TextTransformProcessor.cs b/Mono.TextTemplating.Build/TextTransformProcessor.cs
index 065a76b..e0eb29b 100644
--- a/Mono.TextTemplating.Build/TextTransformProcessor.cs
+++ b/Mono.TextTemplating.Build/TextTransformProcessor.cs
@@ -80,6 +80,8 @@ public static bool Process (TaskLoggingHelper taskLog, TemplateBuildState previo
var pt = LoadTemplate (generator, inputFile, out var inputContent);
TemplateSettings settings = TemplatingEngine.GetSettings (generator, pt);
+ settings.CodeGenerationOptions.UseRemotingCallContext = buildState.PreprocessTargetRuntimeIdentifier == ".NETFramework";
+
// FIXME: make these configurable, take relative path into account
settings.Namespace = buildState.DefaultNamespace;
settings.Name = Path.GetFileNameWithoutExtension (preprocess.InputFile);
@@ -206,6 +208,8 @@ static MSBuildTemplateGenerator CreateGenerator (TemplateBuildState buildState)
}
}
+ generator.UseRelativeLinePragmas = true;
+
return generator;
}
diff --git a/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ParameterDirectiveProcessor.cs b/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ParameterDirectiveProcessor.cs
index 14a497a..403ec76 100644
--- a/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ParameterDirectiveProcessor.cs
+++ b/Mono.TextTemplating/Microsoft.VisualStudio.TextTemplating/ParameterDirectiveProcessor.cs
@@ -30,11 +30,12 @@
using System.ComponentModel;
using System.IO;
+using Mono.TextTemplating;
using Mono.TextTemplating.CodeDomBuilder;
namespace Microsoft.VisualStudio.TextTemplating
{
- public sealed class ParameterDirectiveProcessor : DirectiveProcessor, IRecognizeHostSpecific
+ public sealed class ParameterDirectiveProcessor : DirectiveProcessor, IRecognizeHostSpecific, ISupportCodeGenerationOptions
{
CodeDomProvider provider;
@@ -147,12 +148,8 @@ public override void ProcessDirective (string directiveName, IDictionary ($"_{name}Acquired", Expression.False, out var acquiredVariableRef);
if (hasAcquiredCheck) {
postStatements.Add (acquiredVariable);
@@ -214,16 +211,17 @@ public override void ProcessDirective (string directiveName, IDictionary (data.VariableName, callContextType.InvokeMethod ("LogicalGetData", namePrimitive), out _),
- Statement.If (data.IsNotNull (),
- Then: checkCastThenAssignVal)
- }));
-#endif
+ if (CodeGenerationOptions.UseRemotingCallContext) {
+ var callContextType = TypeReference.Default ("System.Runtime.Remoting.Messaging.CallContext");
+ postStatements.Add (
+ Statement.If (acquiredVariableRef.IsFalse (),
+ Then: new CodeStatement[] {
+ Declare.Variable