如何为.NET Core项目指定程序集版本?

53

我注意到在新的.NET Core项目中没有创建AssemblyInfo.cs文件。我发现你仍然可以设置程序集属性,例如AssemblyVersion等。

是否仍然有使用AssemblyInfo.cs文件的有效理由?

5个回答

68

您完全可以创建一个 AssemblyInfo.cs 文件,并像以前一样配置您的程序集。当然,由于使用程序集属性设置属性,您不需要使用 AssemblyInfo,而可以选择任何其他文件名,甚至是现有文件。

话虽如此,AssemblyInfo.cs 不再包括在默认模板中的原因是新的 SDK 样式项目类型支持在 csproj 项目文件中设置此信息。

因此,设置程序集版本的通常方法是在项目文件中设置 Version 属性(或作为构建过程的一部分自动设置)。例如:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <Version>1.2.3</Version>
  </PropertyGroup></Project>

由于这是一个MSBuild属性,您还可以在构建过程中设置它,例如使用 dotnet build /p:Version = 1.2.3 命令。

此外,还有 VersionPrefix VersionSuffix 属性,可用于从环境(例如Git提交ID或构建号)自动构建版本号。

除了与版本相关的属性外,还可以在项目文件中设置一些其他NuGet属性,这样将使 AssemblyInfo.cs 文件基本上变得多余。


18

根据迁移指南,现在我们有很少灵活的方法来设置程序集属性。

  1. 使用旧式AssemblyInfo.cs文件(手动创建)。
using System;
using System.Reflection;

[assembly: System.Reflection.AssemblyCompanyAttribute("...")]
[assembly: System.Reflection.AssemblyCopyrightAttribute("...")]
[assembly: System.Reflection.AssemblyDescriptionAttribute("...")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("...")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("...")]
[assembly: System.Reflection.AssemblyProductAttribute("...")]
[assembly: System.Reflection.AssemblyTitleAttribute("...")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0-dev01234567")]
  1. 使用 MSBuild 的属性来在构建时生成程序集属性(可以在您的 csproj 文件中静态设置,也可以通过命令行参数传递,例如 /property:Version=1.0.0-dev01234567 )。
<Project Sdk="Microsoft.NET.Sdk.Web">
    <PropertyGroup>
        <Company>...</Company>
        <Copyright>...</Copyright>
        <Description>...</Description>
        <Product>...</Product>
        <AssemblyTitle>...</AssemblyTitle>
        <Version>1.0.0-dev01234567</Version>
    </PropertyGroup>

    ...
</Project>
注意:您可以合并两个解决方案,但避免重复使用程序集属性。

7
如果在使用两种属性设置样式时出现冲突,您可能需要添加 <GenerateAssemblyInfo>false</GenerateAssemblyInfo> - Jesse Chisholm

16

我正在使用Visual Studio 2022和.NET Core 6.

  1. 在“解决方案浏览器”中右键单击项目
  2. 编辑项目文件

这是一个包含“Version”、“AssemblyVersion”和“FileVersion”的示例项目文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <Version>1.0.0</Version>
    <AssemblyVersion>1.0.0.0</AssemblyVersion>
    <FileVersion>1.0.0.0</FileVersion>
  </PropertyGroup>
  ...
</Project>

1
这三个 version 设置有什么区别? - JobaDiniz
https://dev59.com/B3VD5IYBdhLWcg3wKoWH - Hary

9
  1. 在您的项目中,选择属性
  2. 在左侧面板中选择包/常规
  3. 程序集版本文件版本字段中输入您的版本号(例如:1.0.0.0)

enter image description here


2
在Visual Studio 2022和.Net 7中,这很令人困惑。Package > General部分以复选框开始 - 在构建操作中生成NuGet包。这帮助我理解它们确实是具有或不具有Nuget的程序集版本和文件版本。 - JClarkCDS

8
仍然使用AssemblyInfo.cs文件的原因可能包括:
  1. 您想要在项目之间共享部分AssemblyInfo。这可以通过使用文件来实现。
  2. 您可能有一个代码生成过程,可以输出assemblyinfo。
  3. 项目文件格式尚不支持您想要使用的所有属性。项目Sdk知道如何从csproj文件中具有匹配名称的Xml元素自动生成有限的一组[AssembyAttributes],但它不支持自动生成任意[AssembyAttributes]或其他元数据用于程序集。
  4. AssemblyInfo.cs只是一个源代码文件,您可能有其他元数据 - 无论是AssemblyAttributes还是类或其他内容,您希望将所有元数据都保存在一个易于找到的位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接