如何解决.NET Core/Standard 2.0编译时报“CS0579: Duplicate 'Assem的问题
这篇文章给大家介绍如何解决.NET Core/Standard 2.0编译时报"CS0579: Duplicate 'Assem的问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
一、缘由
当创建 .NET Core/Standard 2.0项目时,VS不会像.NET Framework项目一样自动生成AssemblyInfo.cs文件。
而且,若是手工在项目中加入以前写好的 AssemblyInfo.cs 文件,编译时会报告"CS0579: Duplicate 'AssemblyFileVersionAttribute' attribute"错误。
查了一下资料,发现是因为".NET Core/Standard 2.0会自动填写程序集信息"而引起的。
具体来说--
.NET Core/Standard 2.0 推荐在项目属性的"Package"页配置程序集的 版本、描述 等信息。
编译时,会自动根据"Package"页的配置,生成 " <项目名> .AssemblyInfo.cs"。其中便使用了 AssemblyFileVersionAttribute 等特性。
我们的 AssemblyInfo.cs 中也使用 AssemblyFileVersionAttribute 等特性。因为 AssemblyFileVersionAttribute 等特性是不允许重复,于是便报出CS0579错误了。
删除自己的 AssemblyInfo.cs,完全使用推荐做法(项目属性的"Package"页),当然是可以解决该问题、使项目能成功编译的。但是该方案的缺点是没有AssemblyInfo.cs,无法再用"利用条件编译控制程序集特性"等技巧。
第二种办法是在 AssemblyInfo.cs 中加上条件编译,若发现是 .NET Core/Standard 2.0(#if NETCOREAPP2_0 || NETSTANDARD2_0)时,便屏蔽掉 AssemblyFileVersionAttribute 等特性。但该方法比较繁琐。
有没有办法"禁止自动生成程序集特性,完全使用自己的AssemblyInfo.cs"呢?
二、解决
查了一下资料,找到了".NET Core/Standard 2.0 禁止自动生成程序集特性"的办法。就是--修改项目的csproj文件,在PropertyGroup节点内加上" false "
例如修改前是这样的--
Exe netcoreapp2.0 ConsoleExample ConsoleExample
修改后变为这样--
Exe netcoreapp2.0 ConsoleExample ConsoleExample false
改好后便会发现不再自动生成 " <项目名> .AssemblyInfo.cs"了,能使用自己的AssemblyInfo.cs,顺利编译了。
三、深入
3.1 自动生成的机制
" <项目名> .AssemblyInfo.cs"的内容一般是这样的--
//------------------------------------------------------------------------------//// This code was generated by a tool.// Runtime Version:4.0.30319.42000//// Changes to this file may cause incorrect behavior and will be lost if// the code is regenerated.// //------------------------------------------------------------------------------using System;using System.Reflection;[assembly: System.Reflection.AssemblyCompanyAttribute("ConsoleExample")][assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")][assembly: System.Reflection.AssemblyDescriptionAttribute("Package Description")][assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")][assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")][assembly: System.Reflection.AssemblyProductAttribute("ConsoleExample")][assembly: System.Reflection.AssemblyTitleAttribute("ConsoleExample")][assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]// Generated by the MSBuild WriteCodeFragment class.
上面这段自动生成的代码,实际上是由 c:\Program Files\dotnet\sdk\2.0.0\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.GenerateAssemblyInfo.targets
控制的。该文件的内容是--
$(MSBuildAllProjects);$(MSBuildThisFileFullPath) $(IntermediateOutputPath)$(MSBuildProjectName).AssemblyInfo$(DefaultLanguageSourceExtension) true true true true true true true true true true true <_Parameter1>$(Company) <_Parameter1>$(Configuration) <_Parameter1>$(Copyright) <_Parameter1>$(Description) <_Parameter1>$(FileVersion) <_Parameter1>$(InformationalVersion) <_Parameter1>$(Product) <_Parameter1>$(AssemblyTitle) <_Parameter1>$(AssemblyVersion) <_Parameter1>$(NeutralLanguage) $(IntermediateOutputPath)$(MSBuildProjectName).AssemblyInfoInputs.cache $(AssemblyVersion) $(Version)
3.2 部分自动生成
弄清楚机制后,我们可以做成部分自动生成的。即部分程序集特性自动生成,另外一部分来自我们自己的AssemblyInfo.cs。
具体办法是修改项目的csproj文件,在PropertyGroup节点内加上" false "等内容,而不用GenerateAssemblyInfo。
例如--
netcoreapp1.1 Exe false false false
GenerateAssemblyConfigurationAttribute这样的参数名详见 Microsoft.NET.GenerateAssemblyInfo.targets
。
关于如何解决.NET Core/Standard 2.0编译时报"CS0579: Duplicate 'Assem的问题就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。