From 0db67758ebff5728ede0e1b15b7e94691b77fbb1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 2 Feb 2026 11:42:37 +0000 Subject: [PATCH 1/8] Initial plan From a68aff3d26ecdca52cdc9ace75cf1b14ac6f6f54 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 2 Feb 2026 11:51:21 +0000 Subject: [PATCH 2/8] Migrate WriteCodeFragment task to use TaskEnvironment API Co-authored-by: JanProvaznik <25267098+JanProvaznik@users.noreply.github.com> --- .../WriteCodeFragment_Tests.cs | 29 +++++++++++++++++++ src/Tasks/WriteCodeFragment.cs | 25 ++++++++++++---- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs b/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs index 374df4ef58c..476918b0acb 100644 --- a/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs +++ b/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Runtime.InteropServices; +using Microsoft.Build.Framework; using Microsoft.Build.Shared; using Microsoft.Build.Tasks; using Microsoft.Build.Utilities; @@ -27,6 +28,7 @@ public class WriteCodeFragment_Tests public void InvalidLanguage() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; task.Language = "xx"; @@ -44,6 +46,7 @@ public void InvalidLanguage() public void NoLanguage() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; task.OutputFile = new TaskItem("foo"); @@ -60,6 +63,7 @@ public void NoLanguage() public void NoFileOrDirectory() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; task.Language = "c#"; @@ -76,6 +80,7 @@ public void NoFileOrDirectory() public void CombineFileDirectory() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; task.Language = "c#"; @@ -145,6 +150,7 @@ public void FileNameNoDirectory() using TestEnvironment env = TestEnvironment.Create(); var file = env.ExpectFile(Directory.GetCurrentDirectory(), ".tmp"); WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; task.Language = "c#"; @@ -167,6 +173,7 @@ public void FileNameNoDirectory() public void DirectoryAndRootedFile() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; task.Language = "c#"; @@ -202,6 +209,7 @@ public void NoAttributesShouldEmitNoFile() } WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; task.Language = "c#"; @@ -229,6 +237,7 @@ public void NoAttributesShouldEmitNoFile2() } WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; task.Language = "c#"; @@ -248,6 +257,7 @@ public void NoAttributesShouldEmitNoFile2() public void InvalidFilePath() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; task.Language = "c#"; @@ -266,6 +276,7 @@ public void InvalidFilePath() public void InvalidDirectoryPath() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; task.Language = "c#"; @@ -288,6 +299,7 @@ public void OneAttributeNoParams() try { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("System.AssemblyTrademarkAttribute"); @@ -317,6 +329,7 @@ public void OneAttributeNoParams() public void OneAttributeNoParamsVb() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("System.AssemblyTrademarkAttribute"); @@ -340,6 +353,7 @@ public void OneAttributeNoParamsVb() public void TwoAttributes() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute1 = new TaskItem("AssemblyTrademarkAttribute"); @@ -369,6 +383,7 @@ public void TwoAttributes() public void ToDirectory() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("System.AssemblyTrademarkAttribute"); @@ -417,6 +432,7 @@ public void OneAttributeTwoParams() try { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute"); @@ -448,6 +464,7 @@ public void OneAttributeTwoParams() public void OneAttributeTwoParamsSameName() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute"); @@ -471,6 +488,7 @@ public void OneAttributeTwoParamsSameName() public void OneAttributePositionalParamInvalidSuffix() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute"); @@ -494,6 +512,7 @@ public void OneAttributePositionalParamInvalidSuffix() public void OneAttributeTwoPositionalParams() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute"); @@ -518,6 +537,7 @@ public void OneAttributeTwoPositionalParams() public void OneAttributeTwoPositionalParamsWithSameValue() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("AssemblyMetadataAttribute"); @@ -550,6 +570,7 @@ public void MultilineAttributeCSharp() var multilineString = String.Join(Environment.NewLine, lines); WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("System.Reflection.AssemblyDescriptionAttribute"); @@ -586,6 +607,7 @@ public void MultilineAttributeVB() var multilineString = String.Join(Environment.NewLine, lines); WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("System.Reflection.AssemblyDescriptionAttribute"); @@ -619,6 +641,7 @@ public void MultilineAttributeVB() public void OneAttributeSkippedPositionalParams() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute"); @@ -642,6 +665,7 @@ public void OneAttributeSkippedPositionalParams() public void InvalidNumber() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute"); @@ -665,6 +689,7 @@ public void InvalidNumber() public void NoNumber() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute"); @@ -688,6 +713,7 @@ public void NoNumber() public void OneAttributePositionalAndNamedParams() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute"); @@ -721,6 +747,7 @@ public void OneAttributePositionalAndNamedParams() public void OneAttributePositionalAndNamedParamsVisualBasic() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("AssemblyTrademarkAttribute"); @@ -1062,6 +1089,7 @@ public void InferredTypeFallsBackToStringWhenTypeConversionFails() public void MessageDisplayPositionalParameterNameWhenAttributeNotFound() { WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("System.TheAttributeCannotFound"); @@ -1101,6 +1129,7 @@ private WriteCodeFragment CreateTask(string language, TaskItem outputDirectory, { return new WriteCodeFragment() { + TaskEnvironment = TaskEnvironmentHelper.CreateForTest(), Language = language, OutputDirectory = outputDirectory, OutputFile = outputFile, diff --git a/src/Tasks/WriteCodeFragment.cs b/src/Tasks/WriteCodeFragment.cs index e45988febff..b83e7afdb99 100644 --- a/src/Tasks/WriteCodeFragment.cs +++ b/src/Tasks/WriteCodeFragment.cs @@ -30,8 +30,11 @@ namespace Microsoft.Build.Tasks /// /// Currently only supports writing .NET attributes. /// - public class WriteCodeFragment : TaskExtension + [MSBuildMultiThreadableTask] + public class WriteCodeFragment : TaskExtension, IMultiThreadableTask { + /// + public TaskEnvironment TaskEnvironment { get; set; } private const string TypeNameSuffix = "_TypeName"; private const string IsLiteralSuffix = "_IsLiteral"; private static readonly string[] NamespaceImports = ["System", "System.Reflection"]; @@ -104,6 +107,7 @@ public override bool Execute() return true; } + AbsolutePath outputFilePath = default; try { if (OutputFile != null && OutputDirectory != null && !Path.IsPathRooted(OutputFile.ItemSpec)) @@ -111,16 +115,27 @@ public override bool Execute() OutputFile = new TaskItem(Path.Combine(OutputDirectory.ItemSpec, OutputFile.ItemSpec)); } - OutputFile ??= new TaskItem(FileUtilities.GetTemporaryFile(OutputDirectory.ItemSpec, null, extension)); + if (OutputFile != null) + { + outputFilePath = FrameworkFileUtilities.NormalizePath(TaskEnvironment.GetAbsolutePath(OutputFile.ItemSpec)); + } + else + { + AbsolutePath outputDirectoryPath = FrameworkFileUtilities.NormalizePath(TaskEnvironment.GetAbsolutePath(OutputDirectory.ItemSpec)); + outputFilePath = new AbsolutePath(FileUtilities.GetTemporaryFile(outputDirectoryPath, null, extension), ignoreRootedCheck: true); + OutputFile = new TaskItem(outputFilePath.Value); + } - FileUtilities.EnsureDirectoryExists(Path.GetDirectoryName(OutputFile.ItemSpec)); + FileUtilities.EnsureDirectoryExists(Path.GetDirectoryName(outputFilePath.Value)); - File.WriteAllText(OutputFile.ItemSpec, code); // Overwrites file if it already exists (and can be overwritten) + File.WriteAllText(outputFilePath, code); // Overwrites file if it already exists (and can be overwritten) } catch (Exception ex) when (ExceptionHandling.IsIoRelatedException(ex)) { string itemSpec = OutputFile?.ItemSpec ?? String.Empty; - string lockedFileMessage = LockCheck.GetLockedFileMessage(itemSpec); + string lockedFileMessage = outputFilePath.Value != null + ? LockCheck.GetLockedFileMessage(outputFilePath) + : LockCheck.GetLockedFileMessage(itemSpec); Log.LogErrorWithCodeFromResources("WriteCodeFragment.CouldNotWriteOutput", itemSpec, ex.Message, lockedFileMessage); return false; } From 016d864bda168368ee77a786d42da1ef00c38ac9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 4 Feb 2026 14:12:55 +0000 Subject: [PATCH 3/8] Address review feedback: remove NormalizePath and .Value accesses Co-authored-by: JanProvaznik <25267098+JanProvaznik@users.noreply.github.com> --- src/Tasks/WriteCodeFragment.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Tasks/WriteCodeFragment.cs b/src/Tasks/WriteCodeFragment.cs index b83e7afdb99..032a2a5b5d9 100644 --- a/src/Tasks/WriteCodeFragment.cs +++ b/src/Tasks/WriteCodeFragment.cs @@ -117,16 +117,16 @@ public override bool Execute() if (OutputFile != null) { - outputFilePath = FrameworkFileUtilities.NormalizePath(TaskEnvironment.GetAbsolutePath(OutputFile.ItemSpec)); + outputFilePath = TaskEnvironment.GetAbsolutePath(OutputFile.ItemSpec); } else { - AbsolutePath outputDirectoryPath = FrameworkFileUtilities.NormalizePath(TaskEnvironment.GetAbsolutePath(OutputDirectory.ItemSpec)); + AbsolutePath outputDirectoryPath = TaskEnvironment.GetAbsolutePath(OutputDirectory.ItemSpec); outputFilePath = new AbsolutePath(FileUtilities.GetTemporaryFile(outputDirectoryPath, null, extension), ignoreRootedCheck: true); - OutputFile = new TaskItem(outputFilePath.Value); + OutputFile = new TaskItem(outputFilePath); } - FileUtilities.EnsureDirectoryExists(Path.GetDirectoryName(outputFilePath.Value)); + FileUtilities.EnsureDirectoryExists(Path.GetDirectoryName(outputFilePath)); File.WriteAllText(outputFilePath, code); // Overwrites file if it already exists (and can be overwritten) } From 2f2bcf3cbdb86dc2e38440a0203e9a5755f08ad2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:19:57 +0000 Subject: [PATCH 4/8] Remove ignoreRootedCheck from AbsolutePath constructor Co-authored-by: JanProvaznik <25267098+JanProvaznik@users.noreply.github.com> --- src/Tasks/WriteCodeFragment.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tasks/WriteCodeFragment.cs b/src/Tasks/WriteCodeFragment.cs index 032a2a5b5d9..1752ff1286b 100644 --- a/src/Tasks/WriteCodeFragment.cs +++ b/src/Tasks/WriteCodeFragment.cs @@ -122,7 +122,7 @@ public override bool Execute() else { AbsolutePath outputDirectoryPath = TaskEnvironment.GetAbsolutePath(OutputDirectory.ItemSpec); - outputFilePath = new AbsolutePath(FileUtilities.GetTemporaryFile(outputDirectoryPath, null, extension), ignoreRootedCheck: true); + outputFilePath = new AbsolutePath(FileUtilities.GetTemporaryFile(outputDirectoryPath, null, extension)); OutputFile = new TaskItem(outputFilePath); } From a4329865082389bcce41abb449ccb3384051d8d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Provazn=C3=ADk?= Date: Fri, 6 Feb 2026 16:56:22 +0100 Subject: [PATCH 5/8] fix relative path directory edge case --- src/Tasks/WriteCodeFragment.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tasks/WriteCodeFragment.cs b/src/Tasks/WriteCodeFragment.cs index 1752ff1286b..3ef980321f4 100644 --- a/src/Tasks/WriteCodeFragment.cs +++ b/src/Tasks/WriteCodeFragment.cs @@ -123,7 +123,7 @@ public override bool Execute() { AbsolutePath outputDirectoryPath = TaskEnvironment.GetAbsolutePath(OutputDirectory.ItemSpec); outputFilePath = new AbsolutePath(FileUtilities.GetTemporaryFile(outputDirectoryPath, null, extension)); - OutputFile = new TaskItem(outputFilePath); + OutputFile = new TaskItem(Path.Combine(OutputDirectory.ItemSpec, Path.GetFileName(outputFilePath.Value))); } FileUtilities.EnsureDirectoryExists(Path.GetDirectoryName(outputFilePath)); From af34a815db3d9b16a692508b53cad6036a9fe3bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Provazn=C3=ADk?= Date: Fri, 6 Feb 2026 16:58:19 +0100 Subject: [PATCH 6/8] Update src/Tasks/WriteCodeFragment.cs Co-authored-by: Rainer Sigwald --- src/Tasks/WriteCodeFragment.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Tasks/WriteCodeFragment.cs b/src/Tasks/WriteCodeFragment.cs index 3ef980321f4..d90f1c9c106 100644 --- a/src/Tasks/WriteCodeFragment.cs +++ b/src/Tasks/WriteCodeFragment.cs @@ -133,9 +133,7 @@ public override bool Execute() catch (Exception ex) when (ExceptionHandling.IsIoRelatedException(ex)) { string itemSpec = OutputFile?.ItemSpec ?? String.Empty; - string lockedFileMessage = outputFilePath.Value != null - ? LockCheck.GetLockedFileMessage(outputFilePath) - : LockCheck.GetLockedFileMessage(itemSpec); + string lockedFileMessage = LockCheck.GetLockedFileMessage(outputFilePath.Value ?? itemSpec); Log.LogErrorWithCodeFromResources("WriteCodeFragment.CouldNotWriteOutput", itemSpec, ex.Message, lockedFileMessage); return false; } From fba0cca37deabbb937412894ce31428d84934fba Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Feb 2026 16:05:28 +0000 Subject: [PATCH 7/8] Add test for relative OutputDirectory producing relative OutputFile Co-authored-by: JanProvaznik <25267098+JanProvaznik@users.noreply.github.com> --- .../WriteCodeFragment_Tests.cs | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs b/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs index 476918b0acb..681d6c29f07 100644 --- a/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs +++ b/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs @@ -421,6 +421,55 @@ public void ToDirectoryAndDirectoryDoesNotExist() Assert.Equal(".cs", task.OutputFile.ItemSpec.Substring(task.OutputFile.ItemSpec.Length - 3)); } + /// + /// When OutputDirectory is relative and OutputFile is not specified, the resulting OutputFile should be relative. + /// + [Fact] + public void RelativeOutputDirectoryProducesRelativeOutputFile() + { + using TestEnvironment env = TestEnvironment.Create(); + + // Create an actual folder and get a relative path to it + string absoluteFolder = env.CreateFolder().Path; + string relativeFolder = Path.GetFileName(absoluteFolder); + + // Change current directory to the parent so the relative path works + string originalDir = Directory.GetCurrentDirectory(); + try + { + Directory.SetCurrentDirectory(Path.GetDirectoryName(absoluteFolder)); + + WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); + MockEngine engine = new MockEngine(true); + task.BuildEngine = engine; + TaskItem attribute = new TaskItem("System.AssemblyTrademarkAttribute"); + task.AssemblyAttributes = new TaskItem[] { attribute }; + task.Language = "c#"; + task.OutputDirectory = new TaskItem(relativeFolder); + bool result = task.Execute(); + + result.ShouldBeTrue(engine.Log); + + // The output file should be relative (not rooted) since OutputDirectory was relative + Path.IsPathRooted(task.OutputFile.ItemSpec).ShouldBeFalse("OutputFile should be relative when OutputDirectory is relative"); + + // The output file should start with the relative folder name + task.OutputFile.ItemSpec.ShouldStartWith(relativeFolder); + + // Cleanup the generated file + string absoluteOutputFile = Path.Combine(Path.GetDirectoryName(absoluteFolder), task.OutputFile.ItemSpec); + if (File.Exists(absoluteOutputFile)) + { + File.Delete(absoluteOutputFile); + } + } + finally + { + Directory.SetCurrentDirectory(originalDir); + } + } + /// /// Regular case /// From 5e4d0d480a0915ca2546c0f12bf13cb345ed82e0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 9 Feb 2026 09:29:16 +0000 Subject: [PATCH 8/8] Merge main and add TaskEnvironment to CommentIsInvariantCulture test Co-authored-by: JanProvaznik <25267098+JanProvaznik@users.noreply.github.com> --- src/Tasks.UnitTests/WriteCodeFragment_Tests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs b/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs index 75bf3750556..e72f97b3fbd 100644 --- a/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs +++ b/src/Tasks.UnitTests/WriteCodeFragment_Tests.cs @@ -1296,6 +1296,7 @@ public void CommentIsInvariantCulture(string cultureName) System.Globalization.CultureInfo.CurrentUICulture = new System.Globalization.CultureInfo(cultureName); WriteCodeFragment task = new WriteCodeFragment(); + task.TaskEnvironment = TaskEnvironmentHelper.CreateForTest(); MockEngine engine = new MockEngine(true); task.BuildEngine = engine; TaskItem attribute = new TaskItem("System.AssemblyVersionAttribute");