在 AssemblyInfo
中有两个程序集版本:
AssemblyVersion:指定被赋予属性的程序集的版本。 AssemblyFileVersion:指示编译器为 Win32 文件版本资源使用特定版本号。 Win32 文件版本不需要与程序集的版本号相同。
我可以使用以下代码行获取 Assembly Version
:
Version version = Assembly.GetEntryAssembly().GetName().Version;
但是我怎样才能得到 Assembly File Version
?
请参阅我上面的评论,以澄清您真正想要的内容。希望就是这样:
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;
有 three versions:assembly、file 和 product。如果您没有明确指定它们,它们由不同的功能使用并采用不同的默认值。
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;
[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")]
当我想访问应用程序文件版本(在程序集信息 -> 文件版本中设置的内容)时,比如说在表单加载时为其设置标签文本以显示版本,我刚刚使用
versionlabel.Text = "Version " + Application.ProductVersion;
这种方法需要引用 System.Windows.Forms
。
更新:正如 Richard Grimes 在 my cited post、@Iain 和 @Dmitry Lobanov 中提到的,我的回答在理论上是正确的,但在实践中是错误的。
正如我应该从无数书籍等中记得的那样,虽然有人使用 [assembly: XXXAttribute]
设置这些属性,但它们会被编译器劫持并放入 VERSIONINFO
资源中。
由于上述原因,您需要使用 @Xiaofu's answer 中的方法,因为在从属性中提取信号后会剥离属性。
公共静态字符串 GetProductVersion() { var 属性 = (AssemblyVersionAttribute)Assembly .GetExecutingAssembly() .GetCustomAttributes( typeof(AssemblyVersionAttribute), true ) .Single();返回属性。信息版本; }
(来自 http://bytes.com/groups/net/420417-assemblyversionattribute - 如那里所述,如果您正在寻找不同的属性,请将其替换为上述属性)
AssemblyName.Version
属性检索程序集版本。但是对于所有其他属性,这是正确的方法
AssemblyInformationalVersionAttribute
而不是 AssemblyVersionAttribute
用这个:
((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
Assembly.GetExecutingAssembly(),
typeof(AssemblyFileVersionAttribute), false)
).Version;
或这个:
new Version(System.Windows.Forms.Application.ProductVersion);
FileVersionInfo
是否只有string
个属性而没有Version
个属性?Assembly.GetEntryAssembly()
例如在 Office 加载项的上下文中以及在许多其他情况下返回 NULL。此外,如果您考虑插件/插件 - EntryAssembly 是主机应用程序,并且通常您想要 YourCode(TM) 的版本 :) 除此之外,值得添加到此答案中,答案中使用的assembly.Location
可以是null 也是如此(即第一个随机案例用谷歌搜索出来:github.com/Azure/azure-functions-host/issues/1233),这可能比 null entry-assembly 发生得更频繁。