【问题标题】:C# AssemblyFileVersion usage within a programC# AssemblyFileVersion 在程序中的使用
【发布时间】:2010-10-16 12:31:06
【问题描述】:

我正在开发一个程序,我正在尝试显示程序集 FILE 版本

    public static string Version
    {
        get
        {
            Assembly asm = Assembly.GetExecutingAssembly();
            FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(asm.Location);
            return String.Format("{0}.{1}", fvi.FileMajorPart, fvi.FileMinorPart);
        }
    }

目前,这仅返回“AssemblyVersion”中的前两个版本号,而不是“AssemblyFileVersion”。我真的很想只引用 AssemblyFileVersion 而不是存储一个名为“Version”的内部变量,我必须同时更新这个和程序集版本......

[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("3.5.0")]

这是我来自 AssemblyInfo.cs 的 AssemblyFileVersion。我只想引用“3.5.x”部分,而不是“1.0.*”:/

谢谢, 扎克

【问题讨论】:

  • 您已经完成了 99%,只需将返回更改为 fvi.FileVersion
  • 请参阅stackoverflow.com/a/12528418/492 以从特定 DLL,而不是父执行应用程序获取版本信息。

标签: c# assemblyinfo


【解决方案1】:

使用 ProductMajorPart/ProductMinorPart 代替 FileMajorPart/FileMinorPart :

    public static string Version
    {
        get
        {
            Assembly asm = Assembly.GetExecutingAssembly();
            FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(asm.Location);
            return String.Format("{0}.{1}", fvi.ProductMajorPart, fvi.ProductMinorPart);
        }
    }

【讨论】:

  • 错误。我刚刚意识到它正在获取 .dll 的版本!不完全是我想要的。我想要可执行版本。 (忘了提到它是从 .dll 调用的)
  • 组装 asm = Assembly.GetEntryAssembly();
  • 请注意 fvi.FileVersion 将直接为您提供格式化的字符串(所有四个部分),如果这是您需要的...
【解决方案2】:
using System.Reflection;
using System.IO;

FileVersionInfo fv = System.Diagnostics.FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);

Console.WriteLine("AssemblyVersion : {0}", Assembly.GetExecutingAssembly().GetName().Version.ToString());

Console.WriteLine ("AssemblyFileVersion : {0}" , fv.FileVersion.ToString ());

【讨论】:

    【解决方案3】:
        var fileVersion = GetCustomAttributeValue<AssemblyFileVersionAttribute>(assembly, "Version");
    
        private static string GetCustomAttributeValue<T>(Assembly assembly, string propertyName)
            where T : Attribute
        {
            if (assembly == null || string.IsNullOrEmpty(propertyName)) return string.Empty;
    
            object[] attributes = assembly.GetCustomAttributes(typeof(T), false);            
            if (attributes.Length == 0) return string.Empty;
    
            var attribute = attributes[0] as T;
            if (attribute == null) return string.Empty;
    
            var propertyInfo = attribute.GetType().GetProperty(propertyName);
            if (propertyInfo == null) return string.Empty;
    
            var value = propertyInfo.GetValue(attribute, null);
            return value.ToString();
        }
    

    【讨论】:

      【解决方案4】:

      要获取当前正在执行的程序集的版本,您可以使用:

      using System.Reflection;
      Version version = Assembly.GetExecutingAssembly().GetName().Version;
      

      Assembly 类还可以加载文件并访问进程中加载​​的所有程序集。

      【讨论】:

      • 它是 AssemblyVersion,而不是 AssemblyFileVersion
      【解决方案5】:

      我猜你将不得不使用 FileVersionInfo 类。

      System.Diagnostics.FileVersionInfo.GetVersionInfo(FullpathToAssembly)

      【讨论】:

      • 我展示的示例使用了 FileVersionInfo。但它只返回“AssemblyVersion”属性。
      • 糟糕。没有完全看到这个问题是我的愚蠢。对此感到抱歉。
      【解决方案6】:
       protected void Application_Start(object sender, EventArgs e)
       {
           _log.InfoFormat("*************{0} **** Version: {1}************  ", Assembly.GetExecutingAssembly().GetName().Name, Assembly.GetExecutingAssembly().GetName().Version);
        }
      

      输出

      INFO Global - *************CustomerFile **** 版本:1.0.17.2510************

      【讨论】:

        猜你喜欢
        • 2010-11-21
        • 1970-01-01
        • 1970-01-01
        • 2010-12-23
        • 2013-11-03
        • 1970-01-01
        • 2010-09-17
        • 2013-03-06
        • 2016-01-04
        相关资源
        最近更新 更多