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






4.03/5 (6投票s)
为 .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,其中最后两个数字是
- 构建号,等于自 2000 年 1 月 1 日以来本地时间的的天数,以及
- 修订号等于自午夜以来本地时间(不考虑夏令时调整)的秒数除以 2
这意味着该软件是在 2022 年 9 月 28 日 17:03 编译的。
有关程序集文件中经典构建和修订代码的完整描述,请参阅 Microsoft 的页面。
在 .NET Framework 5 中创建自动构建和版本号。
诀窍是使用 MSBuild 内联任务来设置构建和版本号。更多信息请参阅 Microsoft 的页面。
需要执行以下步骤
- 为了添加
AssemblyVersion
,必须将其添加到PropertyGroup
中。 - 必须设置
BeforeBuild
事件。 - 必须使用标准 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 日:初始版本