在 .NET Framework 中,使用 AssemblyVersion 和 AssemblyFileVersion 屬性中的 * 確實是可行的,這會讓編譯器在構建時自動生成版本號的後兩部分(Build 和 Revision)。但是,從 .NET Core 開始,引入了決定性編譯(Deterministic Builds),這意味著編譯結果必須是可重複的,不允許使用包含 * 的版本字符串。
.NET Framework 的自動生成版本號
在 .NET Framework 中,你可以在 AssemblyInfo.cs 文件中使用如下代碼:
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.0.0")]
.NET Core 及更高版本中的變化
在 .NET Core 及更高版本中,引入了決定性編譯,不允許使用 * 自動生成版本號。以下是可能的原因和解決方案:
1. 決定性編譯的引入:
決定性編譯確保相同的輸入始終生成相同的輸出,這是為了支持可重複構建和更可靠的版本管理。
2. 解決方案:
使用 MSBuild 任務手動生成版本號。
使用第三方工具如 Nerdbank.GitVersioning 來自動生成版本號。
特別解決方案:
編輯該項目的.csproj文件
引入
<PropertyGroup>
<Deterministic>false</Deterministic>
</PropertyGroup>
具體舉例:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Deterministic>false</Deterministic> <!-- 禁用決定性編譯 -->
</PropertyGroup>
<PropertyGroup>
<AssemblyVersion>1.0.*</AssemblyVersion>
<FileVersion>1.0.*</FileVersion>
</PropertyGroup>
</Project>
簡單來講,就是直接禁用決定性編譯。
在 .NET 8.0 項目中,默認情況下 Properties 資料夾下確實不會有 AssemblyInfo.cs 文件。這是因為 .NET Core 以來,這些資訊被整合到了專案檔(.csproj)中。你可以在 .csproj 文件中找到或設定組件資訊,例如版本號、公司名稱、產品名稱等。
若需要新增或自訂組件資訊,可以在 .csproj 文件中新增以下設定:
<PropertyGroup>
<AssemblyTitle>你的組件名稱</AssemblyTitle>
<AssemblyDescription>你的組件描述</AssemblyDescription>
<AssemblyCompany>你的公司名稱</AssemblyCompany>
<AssemblyProduct>你的產品名稱</AssemblyProduct>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
<FileVersion>1.0.0.0</FileVersion>
</PropertyGroup>
這些設定會自動生成到組件的元數據中,而不需要額外的 AssemblyInfo.cs 文件。如果你還是需要使用 AssemblyInfo.cs,可以手動新增這個文件並在其中設定組件資訊。但大多數情況下,直接在 .csproj 文件中進行配置會更簡單和方便。
如何使用:
Version ver = Assembly.GetExecutingAssembly().GetName().Version;
this.Text += string.Format(" Ver. {0}", ver.ToString());