diff --git a/src/Tasks/ResolveCodeAnalysisRuleSet.cs b/src/Tasks/ResolveCodeAnalysisRuleSet.cs
index 8c1f481d630..19ba3cda53c 100644
--- a/src/Tasks/ResolveCodeAnalysisRuleSet.cs
+++ b/src/Tasks/ResolveCodeAnalysisRuleSet.cs
@@ -13,10 +13,16 @@ namespace Microsoft.Build.Tasks
/// Determines which file, if any, to be used as the code analysis rule set based
/// on the supplied code analysis properties.
///
- public sealed class ResolveCodeAnalysisRuleSet : TaskExtension
+ [MSBuildMultiThreadableTask]
+ public sealed class ResolveCodeAnalysisRuleSet : TaskExtension, IMultiThreadableTask
{
#region Properties
+ ///
+ /// Gets or sets the task execution environment for thread-safe path resolution.
+ ///
+ public TaskEnvironment TaskEnvironment { get; set; } = TaskEnvironment.Fallback;
+
///
/// The desired code analysis rule set file. May be a simple name, relative
/// path, or full path.
@@ -84,7 +90,8 @@ private string GetResolvedRuleSetPath()
if (!string.IsNullOrEmpty(MSBuildProjectDirectory))
{
string fullName = Path.Combine(MSBuildProjectDirectory, CodeAnalysisRuleSet);
- if (FileSystems.Default.FileExists(fullName))
+ AbsolutePath absolute = TaskEnvironment.GetAbsolutePath(fullName);
+ if (FileSystems.Default.FileExists(absolute))
{
return CodeAnalysisRuleSet;
}
@@ -96,7 +103,8 @@ private string GetResolvedRuleSetPath()
foreach (string directory in CodeAnalysisRuleSetDirectories)
{
string fullName = Path.Combine(directory, CodeAnalysisRuleSet);
- if (FileSystems.Default.FileExists(fullName))
+ AbsolutePath absolute = TaskEnvironment.GetAbsolutePath(fullName);
+ if (FileSystems.Default.FileExists(absolute))
{
return fullName;
}
@@ -109,16 +117,21 @@ private string GetResolvedRuleSetPath()
if (!string.IsNullOrEmpty(MSBuildProjectDirectory))
{
string fullName = Path.Combine(MSBuildProjectDirectory, CodeAnalysisRuleSet);
- if (FileSystems.Default.FileExists(fullName))
+ AbsolutePath absolute = TaskEnvironment.GetAbsolutePath(fullName);
+ if (FileSystems.Default.FileExists(absolute))
{
return CodeAnalysisRuleSet;
}
}
}
- else if (FileSystems.Default.FileExists(CodeAnalysisRuleSet))
+ else
{
// This is a full path.
- return CodeAnalysisRuleSet;
+ AbsolutePath absolute = TaskEnvironment.GetAbsolutePath(CodeAnalysisRuleSet);
+ if (FileSystems.Default.FileExists(absolute))
+ {
+ return CodeAnalysisRuleSet;
+ }
}
// We can't resolve the rule set to any existing file.