用途:指导将 MSBuild 任务迁移为支持多线程执行模式,并做兼容性红队审查。MSBuild 多线程模型要求任务避免全局进程状态(工作目录、环境变量),线程安全任务通过 MSBuildMultiThreadableTask 声明能力,并用 IMultiThreadableTask 的 TaskEnvironment 获取安全替代方案。
主要能力与用法:迁移分四步。一、在具体任务类上加 [MSBuildMultiThreadableTask](Inherited=false,每个具体类都要加);仅当需要 TaskEnvironment API(路径绝对化、环境变量、启动进程)时才实现 IMultiThreadableTask,并设 TaskEnvironment = TaskEnvironment.Fallback。二、文件操作前用 TaskEnvironment.GetAbsolutePath() 绝对化路径,AbsolutePath 含 Value、OriginalValue、GetCanonicalForm(),可隐式转 string;null/空输入会抛 ArgumentException。三、用 TaskEnvironment.GetEnvironmentVariable/SetEnvironmentVariable 替换 Environment 对应方法。四、用 TaskEnvironment.GetProcessStartInfo() 替换 ProcessStartInfo。测试中自定义任务需设 TaskEnvironment = TaskEnvironmentHelper.CreateForTest()。
限制与审查:禁止 Environment.Exit、FailFast、Process.Kill、ThreadPool.SetMin/MaxThreads、Console.* 等;Assembly.Load*、Activator.CreateInstance* 需审查版本冲突。TaskEnvironment 本身非线程安全,任务内部多线程需自行同步。兼容性方面列出六类常见缺陷:输出属性被绝对化值污染、错误信息路径膨胀、?? 改变控制流、try-catch 作用域不匹配、规范化差异(GetAbsolutePath 不做规范化,需 GetCanonicalForm())、异常类型变化。审查协议含逐行追踪、空/边界输入分析、下游影响与并发检查,并给出签核清单与跨 net472/net10.0 测试要求。