如何获得执行程序集的版本?


169

我正在尝试使用以下代码在C#3.0中获取执行程序集版本:

var assemblyFullName = Assembly.GetExecutingAssembly().FullName;
var version = assemblyFullName .Split(',')[1].Split('=')[1];

还有另一种合适的方法吗?

Answers:


293

两个选项...无论您使用哪种应用程序类型,都可以随时调用:

Assembly.GetExecutingAssembly().GetName().Version

如果是Windows Forms应用程序,则在专门查找产品版本时始终可以通过应用程序访问。

Application.ProductVersion

使用GetExecutingAssembly程序集的引用并不总是一个选项。因此,我个人认为在可能需要引用基础程序集或程序集版本的项目中创建静态帮助器类很有用:

// A sample assembly reference class that would exist in the `Core` project.
public static class CoreAssembly
{
    public static readonly Assembly Reference = typeof(CoreAssembly).Assembly;
    public static readonly Version Version = Reference.GetName().Version;
}

然后,我可以CoreAssembly.Version根据需要在我的代码中干净引用。


7
如果它与ClickOnce一起部署,则需要检查System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion
Justin Morgan

有趣的是:您需要在哪里指定实际版本?我在AssemblyInfo.cs中指定了AssemblyVersion和AssemblyFileVersion,尽管指定了1.0.0
但从

@Zainodis如果引用的ClickOnce是@Justin提到的版本,则Publish在项目属性中的选项卡上指定该版本(即,与AssemblyVersion或AssemblyFileVersion不相关)。
克里斯·巴克斯特

@CalgaryCoder感谢您的答复,我不知道ClickOnce是什么,但是在通过VS编辑AssemblyInfo文件时发现它突然起作用了。在文本编辑器中手动编辑AssemblyInfo.cas,使所有字段都变为空。无论哪种方式,现在都可以解决:)
AgentKnopf 2013年

7
值得一提的是,由于启动上下文,这在ASP.NET MVC应用程序中不起作用。一种解决方法是在您的网站程序集中引用一个已知的Type,例如无处不在的MVC HomeController,因此在Razor中:v@(Assembly.GetAssembly(typeof(MyWebProject.Mvc.Controllers.HomeController)).GetName().Version.ToString(2))
James McCormack 2014年

38

在MSDN中,Assembly.GetExecutingAssembly Method表示方法“ getexecutingassembly”,出于性能原因,仅当在设计时不知道当前正在执行什么程序集时才应调用此方法。

检索表示当前程序集的Assembly对象的推荐方法是使用Type.Assembly在程序集中找到的类型的属性。

以下示例说明:

using System;
using System.Reflection;

public class Example
{
    public static void Main()
    {
        Console.WriteLine("The version of the currently executing assembly is: {0}",
                          typeof(Example).Assembly.GetName().Version);
    }
}

/* This example produces output similar to the following:
   The version of the currently executing assembly is: 1.1.0.0

当然,这与帮助程序类“公共静态类CoreAssembly”的答案非常相似,但是,如果您知道至少一种执行程序集的类型,则不必强制创建帮助程序类,这样可以节省时间。


19
using System.Reflection;
{
    string version = Assembly.GetEntryAssembly().GetName().Version.ToString();
}

来自MSDN的评论http://msdn.microsoft.com/zh-cn/library/system.reflection.assembly.getentryassembly%28v=vs.110%29.aspx

当从非托管应用程序加载托管程序集时,该GetEntryAssembly方法可以返回null。例如,如果非托管应用程序创建了用C#编写的COM组件的实例,GetEntryAssembly则C#组件对方法的调用返回null,因为该过程的入口点是非托管代码而不是托管程序集。


2
+1。从参考库中调用时,GetEntryAssembly(vs GetCallingAssemblyGetExecutingAssembly)似乎是唯一起作用的东西。
drzaus 2014年



1

Product Version 如果您通过GitVersion或其他版本控制软件使用版本控制,则可能是首选。

要从您的类库中获取此信息,可以调用System.Diagnostics.FileVersionInfo.ProductVersion

using System.Diagnostics;
using System.Reflection;

//...

var assemblyLocation = Assembly.GetExecutingAssembly().Location;
var productVersion = FileVersionInfo.GetVersionInfo(assemblyLocation).ProductVersion

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.