EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

.NET如何生成winform程式的版本號

在 .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());

 

This article was last edited at 2024-08-21 10:52:15

Today's comments have reached the limit. If you want to comment, please wait until tomorrow (UTC-Time).

There is 07h37m40s left until you can comment.