目录
介绍
.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,其中最后两个数字是:
- 内部版本号,等于自当地时间2000年1月1日以来的天数,以及
- 修订号等于自当地时间午夜以来的秒数(不考虑夏令时的时区调整),除以2
这转换成2022年9月28日17:03编译的软件。
程序集文件中经典生成和修订代码的完整说明可以在 Microsoft的页面上找到。
在.NET Framework 5中创建自动生成和版本号
诀窍是使用MSBuild内联任务来设置生成和版本号。更多信息可以在Micosofts的页面上找到。
需要执行以下步骤:
- 要添加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”在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