如何获取程序集文件版本


727

AssemblyInfo有两个集版本:

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

我可以Assembly Version使用以下代码行获取:

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

但是我怎么能得到Assembly File Version呢?


2
与“程序集版本”相对应,“程序集文件版本”是什么意思?你能给个例子吗?
小夫

7
@Xiaofu-.NET内部使用的是“汇编版本”。右键单击文件并转到“属性”,然后单击“详细信息”选项卡,将显示“汇编文件版本”。他们不一样。
rory.ap

我发现程序集版本是确定AppData中的user.config位置时使用的程序集版本。
凯尔·德莱尼

Answers:


866

请参阅上面的我的评论,要求澄清您真正想要的内容。希望是这样:

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

4
@Xiaofu:有什么方法可以从AssemblyInfo.cs文件中获取版本号吗?
马库斯

56
这段代码的一个问题是,如果您未指定内部版本号和修订版本号,它实际上将返回1.0。*。*。AssemblyName.GetAssemblyName(assembly.Location).Version.ToString(); 将为您提供“已编译”的版本号-如果您以相同的方式设置两个版本,则该版本号应与FileVersion相同。
Doguhan Uluca

17
@DoguhanUluca他们是两件事。这将为您提供程序集版本,而不是文件版本。“如果您以相同的方式设置两个版本”是一种解决方法,而不是解决方案。
Nyerguds 2015年

1
难道FileVersionInfo只有string性,没有Version属性呢?
凯尔·德莱尼

3
@Yitzchak:Assembly.GetEntryAssembly()例如在Office加载项的上下文中以及在其他许多情况下,返回NULL。另外,如果您考虑添加程序/插件-EntryAssembly是宿主应用程序,并且通常您想要的是YourCode(TM)的版本:)除此之外,值得补充的是,答案中assembly.Location使用的答案也可以为null (即,第一个随机情况用谷歌搜索出来:github.com/Azure/azure-functions-host/issues/1233),而且这种情况发生的次数可能比空输入程序集还要多。
quetzalcoatl

209

三个版本程序集文件产品。它们由不同的功能使用,并且如果您未明确指定它们,则采用不同的默认值。

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;

17
当该博客文章有一天消失时,这里将其归结为参考: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;
JMD 2015年

3
对于那些想要在AssemblyInfo.cs文件中指定这些名称的用户,对于assemblyVersion使用(具有您想要的任何数字)=== [assembly: AssemblyVersion("2.0.*")]对于fileVersion使用=== [assembly: AssemblyFileVersion("2.0.*")]和对于productVersion使用=== [assembly: AssemblyInformationalVersion("2.0.*")] 为了SemVer兼容性,最后一个可能带有字符串后缀:[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
Jesse Chisholm

附录:AssemblyFileVersion不得使用*后缀符号。:(它需要所有四个数字。[assembly: AssemblyFileVersion("2.0.0.1")]
杰西·奇泽姆

66

当我要访问应用程序文件版本(在“装配体信息->文件版本”中设置的内容)时,例如说要在表单加载时为其设置标签文本以显示版本,我刚刚使用了

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

53
请注意,这需要引用System.Windows.Forms,因此可能并不适合所有应用程序。
BradleyDotNET

2
不幸的是,这是一个字符串。如果要自己格式化为更简单的“ v1.08”格式,则不理想。如果您实际上获得了版本对象以整数形式获取子组件,则要麻烦得多。
Nyerguds 2015年

1
另外,这会从AssemblyInfo而不是AssemblyVersion中获取AssemblyFileVersion,因此请注意
dario_ramos

高级代表用户可以编辑此答案以使其更清楚地表明这仅适用于Windows窗体吗?
jrh

这正是我在寻找的东西,谢谢您的回答!
David Refoua '18

23

更新:正如Richard Grimes在我引用的帖子 @Iain和@Dmitry Lobanov中提到的那样,我的回答在理论上是正确的,但在实践中是错误的。

正如我从无数本书等中所记得的那样,虽然使用设置了这些属性[assembly: XXXAttribute],但它们却被编译器劫持并放入VERSIONINFO资源中。

由于上述原因,您需要在@Xiaofu的答案中使用该方法,因为在从信号中提取信号之后,这些属性将被剥离。


公共静态字符串GetProductVersion()
{
  var属性=(AssemblyVersionAttribute)
    .GetExecutingAssembly()
    .GetCustomAttributes(typeof(AssemblyVersionAttribute),true)
    。单();
   return attribute.InformationalVersion;
}

(来自http://bytes.com/groups/net/420417-assemblyversion属性-如此处所述,如果您要查找其他属性,请将该属性替换为上面的属性)


嘿鲁本2笔记。首先,该问题询问的是AssemblyFileVersion而不是AssemblyVersion。其次,Assembly.GetExecutingAssembly()。GetCustomAttributes(typeof(AssemblyVersionAttribute),true)返回长度为0的数组。我认为这是因为AssemblyVersionAttribute不是自定义属性。
伊恩

关于第一点,这就是为什么我说“如果您希望使用其他属性,请将其替换为上面的内容”(IIRC,我没有尝试过)。关于第二个,这似乎是合理的,但是没有时间去挖掘……
Ruben Bartelink 09年

是的,实际上您无法通过.GetCustomAttribute()获取AssemblyVersion属性,AssemblyName.Version只能通过property 检索程序集版本。但与其他所有属性,它是做正确的方式
德米特里·洛巴诺夫

@DmitryLobanov和Iain感谢您的提示。我希望所做的修改能够充分覆盖它,使答案值得保留而不是删除-让我知道!
鲁宾·巴特林克

1
我使用的AssemblyInformationalVersionAttribute不是AssemblyVersionAttribute.net core 3.1
而是

5

用这个:

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

或这个:

new Version(System.Windows.Forms.Application.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.