获取我的C#应用程序的版本?

59

我正在开发桌面应用程序,已经创建了一个安装包。

例如:我的应用程序版本是1.0.0。

我想获取当前桌面应用程序的版本,即1.0.0。我尝试使用Application.ProductVersion,但它只提供了控件的版本信息。(我使用的是DevExpress Control15.2.7,所以它提供的当前版本是15.2.7

如何获取已安装应用程序的当前版本?我想将其与已安装版本进行比较,以为我的产品提供“新版本可用”功能。


1
取决于您的应用程序是如何实现的。基本上,无法回答问题。 - Leri
1
@Leri 这是由InstallShield Express Edition 2015创建的安装程序。 - Nanji Mange
7个回答

112

你需要寻找的信息位于AssemblyInfo.cs中。

在运行时,您可以使用System.Reflection.Assembly来访问在其中编写的信息。

使用System.Reflection.Assembly.GetExecutingAssembly()获取程序集(包含此行代码的程序集),或者使用System.Reflection.Assembly.GetEntryAssembly()获取启动项目的程序集(通常是您的应用程序)。

在多项目解决方案中,这是需要注意的事情!

string version = Assembly.GetExecutingAssembly().GetName().Version.ToString()
// returns 1.0.0.0

对应的AssemblyInfo.cs文件:

AssemblyInfo.cs

对应的EXE属性

EXE properties

这可能在使用InstallShield时很重要(请参见评论)!


请查看您的AssemblyInfo.cs文件。里面写了什么? - Felix D.
3
如果这并没有起到帮助作用,尝试使用GetEntryAssembly而不是GetExecutingAssembly进行操作。 - Felix D.
我没有设置程序集信息。我正在使用第三方InstallShield创建安装程序。我已经在其中设置了版本和所有内容,但没有在程序集中设置。我以为InstallShield会自动处理。无论如何,我已经更改了程序集信息。现在它可以正常工作了。如果我还有误解,请告诉我。 - Nanji Mange
3
我原以为InstallShield会管理这一切,但这是错误的假设,请参阅此处。 - Sinatr

14
System.Reflection.Assembly executingAssembly = System.Reflection.Assembly.GetExecutingAssembly();
var fieVersionInfo = FileVersionInfo.GetVersionInfo(executingAssembly .Location);
var version = fieVersionInfo.FileVersion;

1
它返回的是“15.2.7.0”,这是我的DevExpress组件版本。 - Nanji Mange
1
执行Assembly.Location给你什么?你的应用程序exe路径还是其他东西? - Nitin
1
以下是所有参数。(1)程序集位置:C:\Program Files (x86)\MyApplication\MyApplication.exe。(2)文件版本/产品版本:15.2.7.0。 - Nanji Mange

6

另一种方法基本上与已接受的答案相同,即:

Version appVersion = Assembly.GetExecutingAssembly().GetName().Version;
versionLabel.Text = "v" + appVersion.Major + "." + appVersion.Minor + "." + appVersion.Build + ".";

2

获取特定程序集的版本:

private const string AssemblyName = "MyAssembly"; // Name of your assembly

public Version GetVersion()
{
    // Get all the assemblies currently loaded in the application domain.
    Assembly[] assemblies = Thread.GetDomain().GetAssemblies();

    for (int i = 0; i < assemblies.Length; i++)
    {
        if (string.Compare(assemblies[i].GetName().Name, AssemblyName) == 0)
        {
            return assemblies[i].GetName().Version;
        }
    }

    return Assembly.GetExecutingAssembly().GetName().Version; // return current version assembly or return null;
}

我最初使用的是 Assembly.GetEntryAssembly(),在 Visual Studio 调试和独立运行时都能正常工作,但当 XAML 设计器加载时,它会返回当前 Visual Studio 版本(或某个组件的版本)。这个解决方案在所有三种情况下都有效 :D - Clonkex

1
this.Text = this.Text + " " + Application.ProductVersion;

1
这个问题已经有5个现有答案,其中包括一个得票最高、被接受的答案,获得了一百多个赞同票。你确定你的解决方案还没有被提供过吗?如果不是,为什么你认为你的方法比已经得到社区验证的现有建议更好?在Stack Overflow上提供解释总是有用的,但在问题已经得到提问者和社区满意解决的情况下,这尤其重要。通过解释你的答案与众不同之处以及何时可能更受欢迎,帮助读者更好地理解。 - Jeremy Caney

0

如果您正在使用Windows窗体应用程序,您可以仅使用ProductVersion

// Set form text. This is showing upper the form titel bar
this.Text = "Application name" + ProductVersion;

0
我知道这是一个较旧的帖子,但我想展示一下我在这方面所做的工作,并且对于你上面提到的任何方法,以及这个方法,都有一些注意事项。
    this.Text = "My Awesome App";

    //Get Version
    if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
    {
        Version ver = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion;
        this.Text += string.Format(" v{0}.{1}", ver.Major, ver.Revision, Assembly.GetEntryAssembly().GetName().Name);
    }
    else
    {
        var ver = Assembly.GetExecutingAssembly().GetName().Version;
        this.Text += string.Format(" v{0}.{1}", ver.Major, ver.Revision, Assembly.GetEntryAssembly().GetName().Name);
    }

以下是注意事项:
  1. 您可以将其发布为一种可点击的应用程序或独立应用程序,并获得版本。
  2. 在测试期间您看不到它,只有在您发布并从发布位置运行后才能看到它。很长一段时间我一直在寻找它在测试期间的出现,但遗憾的是它只在发布后显示。
  3. 在这里,我只使用了主要版本和修订版本。我想看到 "我的超棒应用v1.3"。如果您愿意,您可以通过使用主要/次要/构建/修订版本来添加内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接