2013-05-14 105 views
0

我有一个用C#编写的WinForms应用程序。有一个部署项目,它创建一个setup.exe,并在其中设置一个版本号。如何获取存储在部署项目中的产品版本号?

如何在运行时获取此版本号,以便我可以将其写入日志或将其显示在关于框中?

我一直在使用下面的代码,但它不适用于64位安装。

RegistryKey key = Registry.LocalMachine.OpenSubKey(
     @"Software\Microsoft\Windows\CurrentVersion\Uninstall"); 
string[] subKeyNames = key.GetSubKeyNames(); 

foreach (string subKeyName in subKeyNames) 
{ 
    Microsoft.Win32.RegistryKey subKey2 = key.OpenSubKey(subKeyName); 

    if (ValueNameExists(subKey2.GetValueNames(), "DisplayName") 
     && ValueNameExists(subKey2.GetValueNames(), "DisplayVersion")) 
    { 
     string name = subKey2.GetValue("DisplayName").ToString(); 
     string version = subKey2.GetValue("DisplayVersion").ToString(); 
     if(name == "MyAppName") return version; 
    } 
    subKey2.Close(); 
} 
key.Close(); 
return "v?"; 

回答

0

如果你只是想显示你的应用程序的关于对话框中的应用程序版本,可以从静态属性获得最新的版本如下:

My.Application.Info.Version 
+0

在C#中是'System.Windows.Forms.Application.Info.Version'吗?如果是这样,它不起作用。找不到'Info'。 – paul 2013-05-14 10:11:53

+0

适用于所有语言的一种是System.Reflection.Assembly.GetExecutingAssembly()。GetName()。版本 – raj 2013-07-04 09:25:48

1

你可以试试这个:

string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
using (Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(registry_key)) 
{ 
    foreach (string subkey_name in key.GetSubKeyNames()) 
    { 
     using (Microsoft.Win32.RegistryKey subkey = key.OpenSubKey(subkey_name)) 
     { 
      if (!object.ReferenceEquals(subkey.GetValue("DisplayName"), null)) 
      { 
       string[] str = subkey.GetValueNames(); 
       string SoftNames = Convert.ToString(subkey.GetValue("DisplayName")); 
       if (SoftNames == "MyAppName") 
       { 
        string Vendor_Publisher = Convert.ToString(subkey.GetValue("Publisher")); 
        string Version = Convert.ToString(subkey.GetValue("DisplayVersion")); 
        string InstallDate = FormatDateTime(subkey.GetValue("InstallDate")); 
       } 

      } 
     } 
    } 
} 



private static string FormatDateTime(object ObjInstallDate) 
{ 
    object FinalDate = DBNull.Value; 
    string strDate = Convert.ToString(ObjInstallDate); 
    DateTime dtm; 
    DateTime.TryParseExact(strDate, new string[] { "yyyyMMdd", "yyyy-MM-dd", "dd-MM-yyyy" }, 
     System.Globalization.CultureInfo.InvariantCulture, 
     System.Globalization.DateTimeStyles.None, out dtm); 
    if (!String.IsNullOrEmpty(strDate)) 
    {     
     FinalDate = dtm; 
    } 
    return FinalDate.ToString(); 
} 
+0

在64位Windows上执行此操作吗?看起来类似于我发布的代码... – paul 2013-05-14 10:35:59

+0

我只在64位Windows上工作。这对我行得通 – Arshad 2013-05-14 10:36:59