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

文章介绍了在.NET5及更高版本中,由于缺少默认的生成和版本号选项,开发者如何通过MSBuild内联任务来手动设置程序集版本号。这个方法涉及在PropertyGroup中添加AssemblyVersion属性,设置BeforeBuild事件,并创建一个UsingTask来利用C#代码动态计算版本号。然而,这种方法在将应用打包成单文件发布时会遇到问题,因为CodeTaskFactory在.NETCore中不受支持,导致编译错误。
摘要由CSDN通过智能技术生成

目录

介绍

在.NET Framework 5中创建自动生成和版本号

选项

问题


介绍

.NET 5.NET 6没有默认的生成和版本号选项,如.NET Framework中所示。

版本号存在于 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

这转换成202292817:03编译的软件。

程序集文件中经典生成和修订代码的完整说明可以在 Microsoft的页面上找到。

.NET Framework 5中创建自动生成和版本号

诀窍是使用MSBuild内联任务来设置生成和版本号。更多信息可以在Micosofts的页面上找到。

需要执行以下步骤:

  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”MSBuild.NET Core版本上不受支持。

和:

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

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

https://www.codeproject.com/Tips/5343784/Classic-or-Custom-Build-and-Version-Numbers-for-As

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值