如何自动将解决方案中的所有项目设置为同一版本?

How do I automatically set all projects in my solution to the same version?

我有一个包含 5 个 C# 项目的 Visual Studio 解决方案。我希望程序集版本在每个项目中都匹配。但看起来我必须进入每个项目的属性并一次单击每个项目的程序集版本。有没有一种方法可以将解决方案视为只有一个适用于每个项目的整体版本?

我认为没有任何解决方案级别的选项可以执行此操作。我使用 powershell 脚本在一个解决方案中为我的 15 个项目实现它。

  $version= "1.3.0.0" 
  (Get-ChildItem -Include AssemblyInfo.cs -Recurse ) | 
     Foreach-Object { 
         Set-Content $_ ((Get-content $_ -Encoding UTF8) -replace "\d+\.\d+\.(\d+|\*)(\.(\d+|\*))?", $version)  -Encoding UTF8 
    }

将此脚本保存在与您的解决方案文件相同的目录中。您还可以将其添加为解决方案本身中的解决方案项目,并在右键单击脚本文件时从 Visual studio 命令行选项启动它。

由于每个项目都有自己的程序集,因此将单独对待它们。我发现最适合我的方法是使用 T4 模板并将其基于模板中的算法,例如,其中修订是自 2000 年 1 月 1 日以来的小时计算:

<#@ template debug="false" hostspecific="false" language="C#" #>
using System.Reflection;
[assembly: AssemblyVersion("1.0.6.<#= this.RevisionNumber #>")]
[assembly: AssemblyFileVersion("1.0.6.<#= this.RevisionNumber #>")]
<#+
    int RevisionNumber = (int)(DateTime.UtcNow - new DateTime(2000,1,1)).TotalHours;
#>

只需创建一个文件,例如GlobalAssemblyInfo.cs 在解决方案根文件夹中,然后向其添加必要的属性,最后将其作为现有项目作为 link.

添加到每个项目中

Solution Explorer 中右键单击 project name > Add > Existing item... 并在对话框中从下拉列表中选择 select Add As Link 选项,如您在此 image.

// Content of GlobalAssemblyInfo.cs file
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

请注意:

  • 您必须从每个项目的 Properties\AssemblyInfo.cs 文件中删除这些属性。
  • 您也可以将其他程序集属性移动到 GlobalAssemblyInfo.cs 文件中

结果是您将只有一个文件可以设置版本,它将应用于所有项目。

更新#1:

.NET 5 项目中,默认情况下会在构建期间自动生成 AssemblyInfo.cs 文件。

自动生成的属性好像只有7个:

  • AssemblyCompanyAttribute
  • AssemblyProductAttribute
  • AssemblyConfigurationAttribute
  • AssemblyVersionAttribute
  • AssemblyFileVersionAttribute
  • AssemblyInformationalVersionAttribute
  • AssemblyTitleAttribute

这里有两个选择:

  • 禁用 AssemblyInfo.cs 文件的自动生成。
  • 启用自动生成 AssemblyInfo.cs 文件并关闭特定属性的生成。

创建一个文件(名称:Directory.Build.props)并将其放在 .sln 文件旁边,以便它将应用于解决方案中的所有项目。

示例 #1 - 禁用自动构建 AssemblyInfo.cs 文件

Directory.Build.props:

<Project>
  <PropertyGroup>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  </PropertyGroup>
</Project>

示例 #2 - 仅禁用特定属性生成

在这种情况下,只需添加 <Generate...>false</Generate...> 行即可禁用特定属性,其中 ... 是属性类型名称。

Directory.Build.props:

<Project>
  <PropertyGroup>
    <GenerateAssemblyInfo>true</GenerateAssemblyInfo>
    <GenerateAssemblyVersionAttribute>false</GenerateAssemblyVersionAttribute>
    <GenerateAssemblyFileVersionAttribute>false</GenerateAssemblyFileVersionAttribute>
    <GenerateAssemblyInformationalVersionAttribute>false</GenerateAssemblyInformationalVersionAttribute>
  </PropertyGroup>
</Project>

备注

在 SDK 样式的项目文件中了解有关 AssemblyInfo properties 的更多信息。

此更新也适用于 .NET Core 版本。

如果特定项目有特殊需要,您也可以覆盖 .csproj 文件中的这些设置。

我一般把属性放成这样:

  • GlobalAssemblyInfo.cs
    • AssemblyCompanyAttribute
    • AssemblyProductAttribute
    • AssemblyCopyrightAttribute
    • AssemblyConfigurationAttribute
    • AssemblyTrademarkAttribute
    • AssemblyCultureAttribute
    • AssemblyVersionAttribute
    • AssemblyFileVersionAttribute
    • AssemblyInformationalVersionAttribute
    • ComVisibleAttribute
  • AssemblyInfo.cs(在特定项目中)
    • AssemblyTitleAttribute
    • AssemblyDescriptionAttribute
    • GuidAttribute