ChatGPT解决这个技术问题 Extra ChatGPT

如何获取程序集文件版本

AssemblyInfo 中有两个程序集版本:

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

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

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

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

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

b
billinkc

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

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 文件中获取版本号?
这段代码的一个问题是,如果您没有指定 Build 和 Revision 编号,它实际上会返回 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 发生得更频繁。
j
juergen d

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;

对于那些想要在 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")]
t
thatguy

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

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

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


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

更新:正如 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 - 如那里所述,如果您正在寻找不同的属性,请将其替换为上述属性)


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

用这个:

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

或这个:

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