为何C#/MSBuild会为不同项目自动使用不同输出路径?
编译输出路径差异的原因
- 项目SDK风格不同:如果是旧的非SDK格式项目(比如.NET Framework时期的项目结构),MSBuild默认会把
Any CPU这个平台名称加到输出路径里;但新的SDK风格项目(.NET Core/.NET 5及以后),Any CPU属于特殊的“中性平台”,SDK默认不会将它作为输出路径的一部分,所以路径里就没有Any CPU层级。 - 构建缓存或全局属性干扰:之前编译留下的
obj目录缓存可能残留了不同的构建配置逻辑,后续编译时被复用,导致路径变化;另外如果编译环境中存在PlatformTarget之类的全局属性(哪怕你没显式指定),也可能触发不同的路径生成规则。 - MSBuild工具链版本差异:不同版本的MSBuild对
Any CPU的处理逻辑不一样,旧版(对应.NET Framework工具链)会严格把平台名纳入路径,新版(对应.NET SDK工具链)针对中性平台做了优化,自动省略路径里的平台名。如果在同时装有.NET Framework和.NET 7 SDK的环境下编译,可能触发不同的工具链,进而导致路径不同。 - 隐含的.targets文件配置:就算你没在项目里写
OutputPath,项目也会导入系统自带的.targets文件(比如Microsoft.Common.targets或Microsoft.NET.Sdk.targets)。非SDK项目导入的.targets用的是带平台名的路径模板,而SDK项目的.targets对中性平台有特殊处理,不会在路径里加平台名。
内容的提问来源于stack exchange,提问作者rwallace
相关产品推荐
相关产品推荐

