我已经阅读了几篇关于 .NET Core 中版本控制程序集的文章。我有使用自动版本控制的 .NET Framework 程序集,其中,在 assemblyInfo.cs 中,我设置了 [assembly: AssemblyVersion("2.1.*")] 属性。当我构建程序集时,我可以检查它的属性,文件和产品版本都反映了类似 2.1.6985.26662 的版本,其中 6985 和 26662 是自动填充的构建和修订号。
我知道在 .NET Core 中我可以在项目文件中设置程序集信息,因此我从项目文件中的以下内容开始:
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
<DockerDefaultTargetOS>Windows</DockerDefaultTargetOS>
<UserSecretsId>7c702802-48ca-46ea-8a7a-1fa89100baef</UserSecretsId>
<Deterministic>false</Deterministic>
<AssemblyVersion>2.1.*</AssemblyVersion>
</PropertyGroup>
Deterministic=false 是必要的,以便版本包含通配符。在我的代码的其他地方,我访问并公开版本,使用
Version serviceVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
DateTime buildDate = new DateTime(2000, 1, 1).AddDays(serviceVersion.Build).AddSeconds(serviceVersion.Revision * 2);
string reportVersion = "{serviceVersion} ({buildDate})";
当我运行该代码时,构建和修订始终为 0。.NET Core 接受版本中的通配符,但似乎不会自动填充构建和修订号。
如果我从项目文件中删除程序集版本并将其放入 assemblyInfo.cs 文件,它似乎可以按我的预期工作。所以我最终在我的项目文件中得到了这个:
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
<DockerDefaultTargetOS>Windows</DockerDefaultTargetOS>
<UserSecretsId>7c702802-48ca-46ea-8a7a-1fa89100baef</UserSecretsId>
<Deterministic>false</Deterministic>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
GenerateAssemblyInfo = false 是必需的,这样自动生成的程序集属性不会与我明确设置的属性冲突。我的 assemblyInfo.cs 文件中有这个:
[assembly: AssemblyVersion("2.1.*")]
我用来读取和访问版本的反射代码是相同的,但它现在具有预期的构建和修订号。
有谁知道当在项目文件中使用通配符设置程序集版本时,自动设置的版本号和修订号是否应该工作?或者我做错了什么导致它不起作用?