2013-02-22 73 views
0

我有一個程序,我已經寫了,並正在嘗試創建一個關於框。我最近將程序的產品版本更新爲1.00.0003,我希望將其反映在關於窗口的窗口中。如何以編程方式使用C#獲取正在運行的程序的產品(不是裝配)版本?

的AboutBox的的缺省設置顯示的一個1.0.0.0值,這是組件版本,而不是產品版本。我一直在淘網上找到如何獲得產品版本。我已經嘗試了所有的這些:

{ 
    Assembly assembly = Assembly.GetExecutingAssembly(); 
    FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location); 
    string version = fileVersionInfo.ProductVersion; 

    Debug.WriteLine(version); 
    Debug.WriteLine(assembly.GetName().Version); 
    string v = VersionNumber; 
    Debug.WriteLine(v); 
    Debug.WriteLine(fileVersionInfo.FileVersion); 
    Debug.WriteLine(Application.ProductVersion); 
    Debug.WriteLine(AssemblyProductVersion); 


    Assembly assembly2 = Assembly.GetEntryAssembly(); 
    FileVersionInfo fileVersionInfo2 = FileVersionInfo.GetVersionInfo(assembly.Location); 
    string version2 = fileVersionInfo2.ProductVersion; 
    Debug.WriteLine(version2); 
    Debug.WriteLine(assembly2.GetName().Version); 

    return version; 
} 

private string _ourVersion = "Version: v"; 

private string VersionNumber 
{ 
    get 
    { 
     System.Reflection.Assembly _assemblyInfo = 
     System.Reflection.Assembly.GetExecutingAssembly(); 
     if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed) 
      _ourVersion += ApplicationDeployment.CurrentDeployment.CurrentVersion.ToString(); 
     else 
     { 
      if (_assemblyInfo != null) 
       _ourVersion += _assemblyInfo.GetName().Version.ToString(); 
     } 
     return _ourVersion; 
    } 
} 

private static string AssemblyProductVersion 
{ 
    get 
    { 
     object[] attributes = Assembly.GetExecutingAssembly() 
      .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false); 
     return attributes.Length == 0 ? 
      "" : 
      ((AssemblyInformationalVersionAttribute)attributes[0]).InformationalVersion; 
    } 
} 

這些回報1.0.0.0每一個人(是的,我也期待他們在控制檯輸出,沒有什麼實際顯示),而不是1.00.0003就像我需要。產品版本在InstallShield設置的「常規信息」選項卡中設置。安裝時,轉到程序和功能顯示1.00.0003的產品版本,所以我無法弄清楚爲什麼這很難以編程方式檢索此值。有任何想法嗎?

+0

如果設置此版本信息的第一個位置在安裝程序中,則不應指望任何編譯的文件包含此信息。顯然,正如你設置的那樣,只有安裝者知道它的版本。 – 2013-02-22 07:20:05

+0

@Damien_The_Unbeliever如何設置它,以便如果我在安裝程序中更改版本,其他所有內容都會相應更改? – Garrett 2013-02-22 07:44:13

+0

你正在考慮錯誤的方法。根據devdigital的回答,您應手動更新*程序集*信息並讓安裝程序*選擇該更改。 – 2013-02-22 07:48:01

回答

2
+0

糾正我,如果我錯了,但不需要手動更新每個構建的命令行參數? – Garrett 2013-02-22 07:38:35

+0

那麼通常你會有一個源代碼庫和一個構建服務器來實現這一點。例如,TeamCity將擁有自己的內部版本號,當您提交更改或想要發佈時,它會自動將該編號應用於所有程序集,並且您將擁有另一個將編號應用於installshield版本的構建步驟。這允許您檢查程序集的內部版本號,並一直追溯到源代碼版本。 – devdigital 2013-02-22 07:43:59

+0

作爲一個單一的開發者,仍然在學校,那些似乎有點不在我的範圍之內。 – Garrett 2013-02-22 07:46:12

1

要檢索的版本1.00.0003是你的產品的安裝程序的版本。要以編程方式獲得此版本,您需要檢查安裝程序(MSI文件),而不是安裝的文件。我不確定這是你想要做什麼,但有一個問題的答案Checking ProductVersion of an MSI programatically解釋如何做到這一點。

如果您希望可執行文件包含相同的版本號,則需要以某種方式存儲版本號,或者使用.NET屬性(如AssemblyFileVersion或Windows VERSIONINFO資源)。

InstallShield允許您在命令行上指定產品版本。這允許您將產品版本存儲在單個文件中,然後將其用作安裝程序中嵌入的產品版本以及組件的AssemblyFileVersion的源。

0

如果只有安裝程序知道這個版本信息,那麼只能從檢索它的唯一地方就是註冊表。

Uninstall Registry Key

下面的安裝程序屬性給註冊表項下寫入的值:

VersionMinor從的ProductVersion屬性衍生

VersionMajor從的ProductVersion屬性衍生

版本從派生ProductVersion屬性

但是我會使用@ devdigital的(隱含的)建議 - 你應該有一個程序集版本實際上匹配你的安裝程序版本。

相關問題