【问题标题】:How can I get the executing assembly version?如何获得正在执行的程序集版本?
【发布时间】:2018-06-04 08:47:07
【问题描述】:

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

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

还有其他合适的方法吗?

【问题讨论】:

    标签: c# .net .net-assembly


    【解决方案1】:

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

    要从你的类库中获取这个,你可以调用System.Diagnostics.FileVersionInfo.ProductVersion

    using System.Diagnostics;
    using System.Reflection;
    
    //...
    
    var assemblyLocation = Assembly.GetExecutingAssembly().Location;
    var productVersion = FileVersionInfo.GetVersionInfo(assemblyLocation).ProductVersion
    

    【讨论】:

      【解决方案2】:

      我最终选择了typeof(MyClass).GetTypeInfo().Assembly.GetName().Version 来购买 netstandard1.6 应用程序。所有其他提出的答案都提供了部分解决方案。这是唯一让我得到我需要的东西。

      来自多个地方:

      https://msdn.microsoft.com/en-us/library/x4cw969y(v=vs.110).aspx

      https://msdn.microsoft.com/en-us/library/2exyydhb(v=vs.110).aspx

      【讨论】:

        【解决方案3】:

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

        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

        【讨论】:

        • 如果使用 ClickOnce 部署,需要查看System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion
        • 有趣的是:您需要在哪里指定实际版本?我在 AssemblyInfo.cs 中指定了 AssemblyVersion 和 AssemblyFileVersion,我从上述方法调用中得到的只是:0.0.0.0 尽管指定了 1.0.0
        • @Zainodis 如果您指的是@Justin 提到的ClickOnce 版本,它在项目属性中的Publish 选项卡上指定(即,与AssemblyVersion 或AssemblyFileVersion 无关)。
        • @CalgaryCoder 感谢您的回复,我不知道 ClickOnce 是什么,但结果是通过 VS 编辑 AssemblyInfo 文件时它突然工作了 oO。在文本编辑器中手动编辑 AssemblyInfo.cas 会使所有字段变为空。不管怎样,现在已经解决了:)
        • 值得一提的是,由于启动上下文,这在 ASP.NET MVC 应用程序中不起作用。一种解决方法是在您的网站程序集中引用已知类型,例如无处不在的 MVC HomeController,所以在 Razor 中:v@(Assembly.GetAssembly(typeof(MyWebProject.Mvc.Controllers.HomeController)).GetName().Version.ToString(2))
        【解决方案4】:

        在 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
        

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

        【讨论】:

          【解决方案5】:
          using System.Reflection;
          {
              string version = Assembly.GetEntryAssembly().GetName().Version.ToString();
          }
          

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

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

          【讨论】:

          • +1。 GetEntryAssembly(与 GetCallingAssemblyGetExecutingAssembly 相比)似乎是从参考库中调用时唯一有效的方法。
          【解决方案6】:

          应该这样做:

          Assembly assem = Assembly.GetExecutingAssembly();
          AssemblyName aName = assem.GetName();
          return aName.Version.ToString();
          

          【讨论】:

          • 这 3 行可能变成 1 : return Assembly.GetExecutingAssembly().GetName().Version.ToString(); ......
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-28
          • 2012-06-06
          • 2023-01-29
          • 1970-01-01
          • 2019-09-29
          • 1970-01-01
          相关资源
          最近更新 更多