在AssemblyInfo中有两个程序集版本:

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

我可以使用以下代码行获取程序集版本:

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

但是,如何获取程序集文件版本?


当前回答

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

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

其他回答

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

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

此方法需要引用System.Windows.Forms。

使用此项:

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

或者这个:

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

交叉发布我的答案来自一个非常相似的问题,因为我在谷歌上搜索我自己的答案,结果在这里。我认为与这里显示的其他方法相比,以下方法具有一些优势。原始答案如下。


public static string? GetInformationalVersion() =>
    Assembly
        .GetEntryAssembly()
        ?.GetCustomAttribute<AssemblyInformationalVersionAttribute>()
        ?.InformationalVersion;

虽然我的答案与其他一些答案相似,但我认为它有一些优点:

它确定条目程序集的信息版本。这意味着该代码可以驻留在更大项目的库中,并且仍然可以获得“用户双击的程序”的版本,而不需要任何依赖性。如果要获取代码所在程序集的版本(即库而不是主程序),可以将GetEntryAssembly()替换为GetExecutingAssembly()它不会通过查看文件来确定信息版本。在某些情况下,I/O操作是不必要的,甚至是不可能的(我正在考虑一些单文件打包方法、AoT变体、从UNC路径执行的软件等)。它与@xanatos的答案分享了以上两个方面,但我更喜欢使用通用扩展方法GetCustomAttribute<T>,并认为这种变体更可读。

另请参阅GetCustomAttribute<T>(程序集)上的Microsoft文档。

更新:正如理查德·格里姆斯在我引用的帖子@Iain和@Dmitry Lobanov中所提到的,我的答案在理论上是正确的,但在实践中是错误的。

我应该从无数本书中记住,当人们使用[assembly:XXXAttribute]设置这些财产时,它们被编译器劫持并放入VERSIONINFO资源中。

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


公共静态字符串GetProductVersion(){var attribute=(AssemblyVersionAttribute)程序集.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyVersionAttribute),true).Single();return attribute.InformationVersion;}(发件人http://bytes.com/groups/net/420417-assemblyversionattribute-如上所述,如果您正在寻找不同的属性,请将其替换为上述属性)

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

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