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

use*_*er1 161 .net c# .net-assembly

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

var assemblyFullName = Assembly.GetExecutingAssembly().FullName;
var version = assemblyFullName .Split(',')[1].Split('=')[1];
Run Code Online (Sandbox Code Playgroud)

还有另一种正确的方法吗?

Chr*_*ter 278

两个选项......无论您何时可以调用应用程序类型:

Assembly.GetExecutingAssembly().GetName().Version
Run Code Online (Sandbox Code Playgroud)

如果是Windows窗体应用程序,如果专门针对产品版本,您始终可以通过应用程序访问.

Application.ProductVersion
Run Code Online (Sandbox Code Playgroud)

使用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;
}
Run Code Online (Sandbox Code Playgroud)

然后我可以CoreAssembly.Version根据需要干净地引用我的代码.

  • 值得一提的是,由于启动上下文,这在ASP.NET MVC应用程序中不起作用.解决方法是引用网站程序集中的已知类型,例如无处不在的MVC`HomeController`,因此在Razor中:`v @(Assembly.GetAssembly(typeof(MyWebProject.Mvc.Controllers.HomeController)).GetName().版本的ToString(2))` (7认同)
  • 如果使用ClickOnce部署,则需要检查`System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion` (6认同)

Sha*_*kis 35

在MSDN中,Assembly.GetExecutingAssembly方法是关于方法"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
Run Code Online (Sandbox Code Playgroud)

当然,这与辅助类"public static class CoreAssembly"的答案非常相似,但是,如果您至少知道一种类型的执行程序集,则不必创建辅助类,这样可以节省您的时间.


小智 18

using System.Reflection;
{
    string version = Assembly.GetEntryAssembly().GetName().Version.ToString();
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • +1.`GetEntryAssembly`(vs`GetCallingAssembly`或`GetExecutingAssembly`)似乎是从参考库中调用时唯一有效的东西. (2认同)

Elr*_*ynn 6

这应该做:

Assembly assem = Assembly.GetExecutingAssembly();
AssemblyName aName = assem.GetName();
return aName.Version.ToString();
Run Code Online (Sandbox Code Playgroud)

  • 这3行可能变为1:返回Assembly.GetExecutingAssembly().GetName().Version.ToString(); ............. (5认同)

Dan*_*iel 5

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

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

using System.Diagnostics;
using System.Reflection;

//...

var assemblyLocation = Assembly.GetExecutingAssembly().Location;
var productVersion = FileVersionInfo.GetVersionInfo(assemblyLocation).ProductVersion
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明