千家信息网

如何解决.NET Core/Standard 2.0编译时报“CS0579: Duplicate 'Assem的问题

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章给大家介绍如何解决.NET Core/Standard 2.0编译时报"CS0579: Duplicate 'Assem的问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助
千家信息网最后更新 2025年02月02日如何解决.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会自动填写程序集信息"而引起的。

具体来说--

  1. .NET Core/Standard 2.0 推荐在项目属性的"Package"页配置程序集的 版本、描述 等信息。

  2. 编译时,会自动根据"Package"页的配置,生成 " <项目名> .AssemblyInfo.cs"。其中便使用了 AssemblyFileVersionAttribute 等特性。

  3. 我们的 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的问题就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

0