Visual Studio编译报错‘Duplicate TargetFrameworkAttribute’原因问询
问题
拉取Git仓库的项目代码后,用Visual Studio编译时出现报错:
duplicate 'global::System.Runtime.Versioning.TargetFrameworkAttribute'
其他同事拉取相同代码、使用同版本Visual Studio可正常编译。添加以下配置到项目的<PropertyGroup>后本地编译恢复正常:
<PropertyGroup> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> <GenerateTargetFrameworkAttribute>false</GenerateTargetFrameworkAttribute> </PropertyGroup>
但同事添加该配置无任何影响,无论有无都能正常编译,想了解这两个配置生效的原因。
原因分析
GenerateTargetFrameworkAttribute的核心作用:这个属性控制MSBuild是否自动生成TargetFrameworkAttribute特性。你的本地编译报错是因为项目里同时存在两份该特性——一份是项目代码手动定义(或通过其他方式生成)的,另一份是MSBuild自动生成的,两者冲突导致重复定义错误。设置为false后,MSBuild不再自动生成该特性,只保留项目中已有的那份,冲突自然消除。GenerateAssemblyInfo的辅助作用:这个属性控制是否自动生成包含版本号、公司信息等内容的程序集特性文件(通常是AssemblyInfo.cs/AssemblyInfo.vb)。如果你的项目已经手动维护了AssemblyInfo文件,同时MSBuild又自动生成了一份,也会引发类似的重复特性冲突。关闭该选项可以避免自动生成文件和手动文件的重复。- 同事本地无影响的原因:大概率是同事的本地环境里,项目的自动生成逻辑没触发重复:
- 可能同事的项目中没有手动定义
TargetFrameworkAttribute,只有MSBuild自动生成的一份,所以不会冲突; - 或者同事的MSBuild全局配置、Visual Studio组件配置和你的存在差异,导致自动生成特性的逻辑没执行;
- 也有可能同事的项目文件中已经默认包含了类似抑制自动生成的配置,只是该配置在
.gitignore文件里,没提交到仓库,你拉取的代码里没有同步到。
- 可能同事的项目中没有手动定义
内容的提问来源于stack exchange,提问作者CopperHead
相关产品推荐
相关产品推荐

