8

.NET 程序集/项目/包的版本号设置有最大范围,最大不能超过 65534

 3 years ago
source link: https://blog.walterlv.com/post/dotnet-version-number-too-large.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

.NET 程序集/项目/包的版本号设置有最大范围,最大不能超过 65534

发布于 2020-06-18 18:15
更新于 2020-06-18 16:05

试过给 .NET Core 项目设置一个大于 65535 的版本号吗?可能没有,因为设置了会炸!


最简问题项目

用最普通的项目模板创建一个 .NET 项目(要求是 SDK 风格的),于是,你会得到两个文件:项目文件 Walterlv.Demo.csproj 和代码文件 Class1.cs。

Walterlv.Demo.csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
</Project>

Class1.cs 应该不用贴出来了,因为没啥关系。

现在,我们加个版本号:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
++      <Version>1.0.0.65535</Version>
        <TargetFramework>netcoreapp3.1</TargetFramework>
      </PropertyGroup>
    </Project>

一编译就立刻编译错误:

编译错误

然而,只要把版本号改到 65534 或者更小的值就没有问题。

因为我们可以知道,在 SDK 风格的项目当中,版本号的任何一位的范围只能是 0~65534。

传统项目没问题

你可能会说,创建了一个 .NET Framework 的项目,并没有出现问题。

那是因为此问题的复现要求:

  1. 必须是 SDK 风格的项目(.NET Core 默认的风格,也可用于 .NET Framework);
  2. 必须是通过 .csproj 或者 .props / .targets 文件来指定的版本号。

这两个条件缺一不可。而通过模板创建的 .NET Framework 项目默认使用的是传统风格的 csproj 项目文件。

如果是传统风格的项目,必须使用 AssemblyInfo.cs 来指定版本号;新的 SDK 风格的版本号也可以使用 AssemblyInfo.cs 来指定版本号。而这两种情况的版本号范围是整个 int 范围(0~2G)。

附,在 SDK 风格项目中使用 AssemblyInfo.cs 来指定版本号前,你需要先用以下属性关闭默认自动生成 AssemblyInfo.cs 功能:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <TargetFramework>netcoreapp3.1</TargetFramework>
++      <GenerateAssemblyInfo>False</GenerateAssemblyInfo>
      </PropertyGroup>
    </Project>

谁的限制?

实际上,版本号限制是 Windows 系统带来的,Windows 系统限制到 65535 了。

虽然你可以通过以上 AssemblyInfo 的方法绕过编译错误,但实际上生成的文件版本会溢出:

溢出的版本号

.NET 运行时是可以支持 int 范围的版本号的,无奈兼容 Windows 的部分却不行。


参考资料

本文会经常更新,请阅读原文: https://blog.walterlv.com/post/dotnet-version-number-too-large.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,或者前往 CSDN 关注我的主页

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected])


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK