65.9K
CodeProject 正在变化。 阅读更多。
Home

适用于 .NET 5 和 .NET 6 的程序集版本号的经典或自定义构建和版本号

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.03/5 (6投票s)

2022 年 10 月 4 日

CPOL

2分钟阅读

viewsIcon

14289

为 .NET 5 和 6 的程序集版本号进行经典/自定义构建。

引言

.NET 5 和 .NET 6 没有像 .NET Framework 中那样默认的构建和版本号选项。

版本号位于 Properties 目录中的 AssemblyInfo.cs 文件中,如下所示

// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.0.0")] 
// when commented out it uses the assembly version

这将用构建和版本号替换星号;结果将类似于 1.0.8306.30708,其中最后两个数字是

  1. 构建号,等于自 2000 年 1 月 1 日以来本地时间的的天数,以及
  2. 修订号等于自午夜以来本地时间(不考虑夏令时调整)的秒数除以 2

这意味着该软件是在 2022 年 9 月 28 日 17:03 编译的。

有关程序集文件中经典构建和修订代码的完整描述,请参阅 Microsoft 的页面

在 .NET Framework 5 中创建自动构建和版本号。

诀窍是使用 MSBuild 内联任务来设置构建和版本号。更多信息请参阅 Microsoft 的页面

需要执行以下步骤

  1. 为了添加 AssemblyVersion,必须将其添加到 PropertyGroup 中。
  2. 必须设置 BeforeBuild 事件。
  3. 必须使用标准 C# 代码创建 UsingTask

代码如下所示

// add the property "AssemblyVersion" to the propertyGroup:
<PropertyGroup>
  <AssemblyVersion>1.0.0.0</AssemblyVersion>
  // more properties here.....

// add the pre-build event, named BeforeBuild in .NET Core:
<Target Name="SetAssemblyVersion" BeforeTargets="BeforeBuild">
  <SetBuildNumber>
    <Output TaskParameter="AssemblyVersion" PropertyName="AssemblyVersion" />
  </SetBuildNumber>
</Target>
// and the task creating the AssemblyVersion
<UsingTask TaskName="SetBuildNumber" TaskFactory="CodeTaskFactory" 
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
  <ParameterGroup>
    <AssemblyVersion ParameterType="System.String" Output="true" />
  </ParameterGroup>
  <Task>
    <Code Type="Fragment" Language="cs">
  	<![CDATA[
  	  Log.LogMessage(MessageImportance.High, "Setting version number");
  	  
  	  // old style automatic build and version number
  	  var now = DateTime.Now;
  	  var secondsSinceMidnightDivivedBy2 = (int)(now - now.Date).TotalSeconds / 2;
  	  var daysSinceJan1st2000 = (int)(now - new DateTime(2000, 1, 1)).TotalDays;
  	  AssemblyVersion = "1.2." + daysSinceJan1st2000.ToString() + "." +
          secondsSinceMidnightDivivedBy2.ToString();
  
  	  Log.LogMessage(MessageImportance.High, "Version number is: " + AssemblyVersion);
  	]]>
    </Code>
  </Task>
</UsingTask>	

选项

此示例将创建一个经典版本号,但使用 C# 代码创建构建和版本,实际上是整个程序集版本号的选项,提供了创建任何所需格式的选项。

问题

虽然这适用于编译和运行软件,但它不适用于编译后的软件,在这种情况下,应用程序会打包成一个包含所有依赖项的文件。

以下示例将失败

dotnet publish $(SolutionDir)MyProject\MyProject.csproj
 -p:PublishProfile=FolderProfile -r:win10-x64 -p:PublishSingleFile=true
 -p:PublishReadyToRun=false -p:PublishTrimmed=false -c:Release -o:$(TargetDir)published 

它将导致以下错误

任务工厂“CodeTaskFactory”不受 .NET Core 版本的 MSBuild 的支持。

无法从程序集“C:\Program Files\dotnet\sdk\6.0.400\Microsoft.Build.Tasks.Core.dll”加载任务工厂“CodeTaskFactory”。任务工厂必须为“TaskType”属性返回值。

由于这些问题对我来说不重要,因此我没有进一步调查它们。

历史

  • 2022 年 10 月 4 日:初始版本
© . All rights reserved.