【问题标题】:How can I get the assembly file version如何获取程序集文件版本
【发布时间】:2010-10-28 21:58:58
【问题描述】:

AssemblyInfo 中有两个汇编版本:

  1. AssemblyVersion:指定要归因的程序集的版本。
  2. AssemblyFileVersion:指示编译器为 Win32 文件版本资源使用特定版本号。 Win32 文件版本不需要与程序集的版本号相同。

我可以通过以下代码行获得Assembly Version

Version version = Assembly.GetEntryAssembly().GetName().Version;

但是我怎样才能得到Assembly File Version

【问题讨论】:

  • 相对于“程序集版本”,“程序集文件版本”是什么意思?能举个例子吗?
  • @Xiaofu -- "Assembly Version" 是 .NET 内部使用的。 “程序集文件版本”是当您右键单击文件并转到“属性”然后转到“详细信息”选项卡时显示的内容。它们不一样。
  • 我发现在 AppData 中确定 user.config 位置时使用的是程序集版本。

标签: c# .net assemblies version


【解决方案1】:

更新:正如 Richard Grimes 在 my cited post、@Iain 和 @Dmitry Lobanov 中提到的,我的回答在理论上是正确的,但在实践中是错误的。

我应该从无数书籍等中记得,虽然使用[assembly: XXXAttribute] 设置这些属性,它们被编译器劫持并放入VERSIONINFO 资源中。 p>

由于上述原因,您需要使用@Xiaofu's answer 中的方法,因为从属性中提取信号后会剥离属性。


公共静态字符串 GetProductVersion() { var 属性 = (AssemblyVersionAttribute)Assembly .GetExecutingAssembly() .GetCustomAttributes( typeof(AssemblyVersionAttribute), true ) 。单身的(); 返回属性。信息版本; }

(来自http://bytes.com/groups/net/420417-assemblyversionattribute - 如那里所述,如果您正在寻找不同的属性,请将其替换为上述属性)

【讨论】:

  • 嘿鲁本,2 个音符。首先,问题是针对 AssemblyFileVersion 而不是 AssemblyVersion。其次,Assembly.GetExecutingAssembly().GetCustomAttributes( typeof(AssemblyVersionAttribute), true ) 返回一个长度为 0 的数组。我认为这是因为 AssemblyVersionAttribute 不是自定义属性。
  • 关于第一点,这就是为什么我说“如果您正在寻找不同的属性,请将其替换为上述属性”(IIRC 我没有尝试过)。关于第二个,这似乎是合理的,但没有时间深入研究......
  • 是的,您实际上无法通过 .GetCustomAttribute() 获取 AssemblyVersion 属性,只能通过 AssemblyName.Version 属性检索程序集版本。但是对于所有其他属性,这是正确的方法
  • @DmitryLobanov 和 Iain 感谢您的提示。我希望编辑足以涵盖它,以使答案值得保留而不是删除 - 让我知道!
  • 我在 .net core 3.1 上使用 AssemblyInformationalVersionAttribute 而不是 AssemblyVersionAttribute
【解决方案2】:

当我想访问应用程序文件版本(在程序集信息 -> 文件版本中设置的内容)时,比如说在表单加载时为其设置标签文本以显示版本,我刚刚使用过

versionlabel.Text = "Version " + Application.ProductVersion;

这种方法需要引用System.Windows.Forms

【讨论】:

  • 请注意,这需要引用 System.Windows.Forms,因此可能不适用于所有应用程序。
  • 不幸的是,这是一个字符串。如果您想自己将其格式化为更简单的“v1.08”格式,则不理想。如果您实际上获取版本对象以从整数中获取子组件,则会更方便。
  • 另外,这会从 AssemblyInfo 中获取 AssemblyFileVersion,而不是 AssemblyVersion,所以要小心
  • 高级代表用户能否编辑此答案以更清楚地表明这仅适用于 Windows 窗体?
  • 这正是我要找的,谢谢你的回答!
【解决方案3】:

请参阅我上面的评论,以了解您真正想要什么。希望就是这样:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;

【讨论】:

  • @Xiaofu:有没有办法从 AssemblyInfo.cs 文件中获取版本号?
  • 这段代码的一个问题是,如果您没有指定构建和修订号,它实际上会返回 1.0.*.*。 AssemblyName.GetAssemblyName(assembly.Location).Version.ToString();将为您提供“编译”版本号 - 如果您以相同的方式设置两个版本,则它应该与 FileVersion 相同。
  • @DoguhanUluca 他们是两个不同的东西。这将为您提供程序集版本,而不是文件版本。 “如果您以相同的方式设置两个版本”是一种解决方法,而不是解决方案。
  • FileVersionInfo 是否只有string 属性而没有Version 属性?
  • @Yitzchak:Assembly.GetEntryAssembly() 例如在 Office 加载项的上下文中以及在许多其他情况下返回 NULL。此外,如果您考虑插件/插件 - EntryAssembly 是主机应用程序,并且通常您想要 YourCode(TM) 的版本 :) 除此之外,值得添加到这个答案中 assembly.Location 在答案中使用可以是null 也是如此(即第一个随机案例用谷歌搜索出来:github.com/Azure/azure-functions-host/issues/1233),这可能比 null entry-assembly 发生得更频繁。
【解决方案4】:

three versionsassemblyfileproduct。如果您没有明确指定它们,它们由不同的功能使用并采用不同的默认值。

string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
string assemblyVersion = Assembly.LoadFile("your assembly file").GetName().Version.ToString(); 
string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; 
string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;

【讨论】:

  • 当那篇博文某天消失时,这里归结为参考:string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); string assemblyVersion = Assembly.LoadFile('your assembly file').GetName().Version.ToString(); string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion; string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
  • 对于那些想要在 AssemblyInfo.cs 文件中指定这些的人,对于 assemblyVersion 使用(使用您想要的任何数字)=== [assembly: AssemblyVersion("2.0.*")] 对于 fileVersion 使用 === [assembly: AssemblyFileVersion("2.0.*")] 和对于 productVersion使用 === [assembly: AssemblyInformationalVersion("2.0.*")] 最后一个可以带字符串后缀为SemVer 兼容性:[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
  • 附录:AssemblyFileVersion 不得使用* 后缀符号。 :( 它需要所有四个数字。[assembly: AssemblyFileVersion("2.0.0.1")]
【解决方案5】:

使用这个:

((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
    Assembly.GetExecutingAssembly(), 
    typeof(AssemblyFileVersionAttribute), false)
).Version;

或者这个:

new Version(System.Windows.Forms.Application.ProductVersion);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2011-04-10
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多