.net 如何获取程序集文件版本

s4chpxco  于 2023-01-06  发布在  .NET
关注(0)|答案(6)|浏览(188)

AssemblyInfo中有两个程序集版本:

  1. AssemblyVersion:指定要属性化的程序集的版本。
  2. AssemblyFileVersion:指示编译器对Win32文件版本资源使用特定的版本号。Win32文件版本不需要与程序集的版本号相同。
    我可以通过以下代码行获得Assembly Version
Version version = Assembly.GetEntryAssembly().GetName().Version;

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

ukdjmx9f

ukdjmx9f1#

请看我上面的评论,要求澄清你真正想要的是什么。希望这就是:

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

jc3wubiy2#

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;
jucafojl

jucafojl3#

当我想访问应用程序文件版本(在Assembly Information -〉File version中设置的)时,说在表单加载时设置标签的文本以显示版本,我刚才使用了

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

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

bakd9h0s

bakd9h0s4#

更新:正如Richard Grimes在my cited post、@Iain和@Dmitry Lobanov中提到的,我的答案在理论上是正确的,但在实践中是错误的。
正如我应该从无数的书籍中记住的那样,当使用[assembly: XXXAttribute]设置这些属性时,* 它们会被编译器劫持并放置到VERSIONINFO资源中 *。
基于上述原因,您需要使用@Xiaofu答案中的方法,因为属性是在提取信号之后剥离的。

public static string GetProductVersion()
{
  var attribute = (AssemblyVersionAttribute)Assembly
    .GetExecutingAssembly()
    .GetCustomAttributes( typeof(AssemblyVersionAttribute), true )
    .Single();
   return attribute.InformationalVersion;
}

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

ylamdve6

ylamdve65#

请使用此选项:

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

或者这个:

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

2g32fytz6#

very similar question交叉发布我的答案,因为我在谷歌上搜索我自己的答案,结果在这里。我认为下面的方法与这里显示的其他方法相比有一些优势。

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

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

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

另请参见Microsoft Docs on GetCustomAttribute<T>(Assembly)

相关问题