How can I get the assembly file version

532,944

Solution 1

See my comment above asking for clarification on what you really want. Hopefully this is it:

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

Solution 2

There are three versions: assembly, file, and product. They are used by different features and take on different default values if you don't explicit specify them.

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;

Solution 3

When I want to access the application file version (what is set in Assembly Information -> File version), say to set a label's text to it on form load to display the version, I have just used

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

This approach requires a reference to System.Windows.Forms.

Solution 4

UPDATE: As mentioned by Richard Grimes in my cited post, @Iain and @Dmitry Lobanov, my answer is right in theory but wrong in practice.

As I should have remembered from countless books, etc., while one sets these properties using the [assembly: XXXAttribute], they get highjacked by the compiler and placed into the VERSIONINFO resource.

For the above reason, you need to use the approach in @Xiaofu's answer as the attributes are stripped after the signal has been extracted from them.


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 - as noted there, if you're looking for a different attribute, substitute that into the above)

Solution 5

Use this:

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

Or this:

new Version(System.Windows.Forms.Application.ProductVersion);
Share:
532,944
Enyra
Author by

Enyra

Updated on October 20, 2021

Comments

  • Enyra
    Enyra over 2 years

    In AssemblyInfo there are two assembly versions:

    1. AssemblyVersion: Specify the version of the assembly being attributed.
    2. AssemblyFileVersion: Instructs a compiler to use a specific version number for the Win32 file version resource. The Win32 file version is not required to be the same as the assembly's version number.

    I can get the Assembly Version with the following line of code:

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

    But how can I get the Assembly File Version?

    • Xiaofu
      Xiaofu almost 15 years
      What do you mean by "assembly file version" as opposed to "assembly version"? Can you give an example?
    • rory.ap
      rory.ap over 7 years
      @Xiaofu -- "Assembly Version" is what .NET uses internally. "Assembly File Version" is what shows when you right-click on a file and go to "properties" then the "details" tab. They are not the same.
    • Kyle Delaney
      Kyle Delaney over 6 years
      I've found that the assembly version is what's used when determining the user.config location in AppData.
  • Iain
    Iain over 14 years
    Hey Ruben, 2 notes. First, the question asked for AssemblyFileVersion not AssemblyVersion. Second, Assembly.GetExecutingAssembly().GetCustomAttributes( typeof(AssemblyVersionAttribute), true ) returns an array of length 0. I think this is because AssemblyVersionAttribute is not a custom attribute.
  • Raymond
    Raymond over 14 years
    Re the first point, thats why I said "if you're lookign for a different attribute, substitute that into the above" (IIRC I didnt try it out). Re the second, that does seem plausible but dont have time to dig in...
  • Markus
    Markus about 12 years
    @Xiaofu: Is there any way to get the version numbers from a AssemblyInfo.cs file instead?
  • Doguhan Uluca
    Doguhan Uluca over 11 years
    One problem with this code is that, it'll actually return 1.0.*.* if you haven't specified Build and Revision numbers. AssemblyName.GetAssemblyName(assembly.Location).Version.ToSt‌​ring(); will get you the 'compiled' version number - which should be the same as FileVersion, if you're setting both versions the same way.
  • Dmitrii Lobanov
    Dmitrii Lobanov about 11 years
    Yeah, you actually can't get AssemblyVersion attribute via .GetCustomAttribute(), assembly version can be retrieved via AssemblyName.Version property only. But with every other attribute it's the right way to do it
  • Raymond
    Raymond about 11 years
    @DmitryLobanov and Iain Thanks for the prompts. I hope the edit covers it sufficiently to make the answer worth keeping instead of deleting - let me know!
  • BradleyDotNET
    BradleyDotNET almost 10 years
    Note that this requires a reference to System.Windows.Forms, and so might not be suitable for all applications.
  • JMD
    JMD over 8 years
    For when that blog post disappears some day, here it is boiled down for reference: string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString()‌​; string assemblyVersion = Assembly.LoadFile('your assembly file').GetName().Version.ToString(); string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly‌​().Location).FileVer‌​sion; string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly‌​().Location).Product‌​Version;
  • Nyerguds
    Nyerguds over 8 years
    Unfortunately, that's a string. Not ideal if you want to format it yourself to a more simple "v1.08" kind of format. Much handier if you actually get the version object to get the sub-components from as integers.
  • Nyerguds
    Nyerguds over 8 years
    Nice, but I much rather use the FileMajorPart / FileMinorPart / FileBuildPart / FilePrivatePart properties to get the integers rather than the preformatted FileVersion string. No one likes to see the "1.9.0.0" kind of thing in the title bar of a program.
  • Nyerguds
    Nyerguds over 8 years
    @DoguhanUluca They're two different things. That'll give you the assembly version, not the file version. "If you're setting both versions the same way" is a workaround, not a solution.
  • Jesse Chisholm
    Jesse Chisholm over 7 years
    And for those wanting to specify these in the AssemblyInfo.cs file, for assemblyVersion use (with whatever numbers you want) === [assembly: AssemblyVersion("2.0.*")] for fileVersion use === [assembly: AssemblyFileVersion("2.0.*")] and for productVersion use === [assembly: AssemblyInformationalVersion("2.0.*")] The last one may take string suffix for SemVer compatibility:[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
  • Jesse Chisholm
    Jesse Chisholm over 7 years
    Addendum: AssemblyFileVersion may not use the * suffix notation. :( It needs all four numbers. [assembly: AssemblyFileVersion("2.0.0.1")]
  • dario_ramos
    dario_ramos over 7 years
    Also, this picks up AssemblyFileVersion from AssemblyInfo, not AssemblyVersion, so watch out
  • jrh
    jrh over 6 years
    Could a high rep user edit this answer to make it more clear that this is for Windows Forms only?
  • Kyle Delaney
    Kyle Delaney over 6 years
    Does FileVersionInfo only have string properties and no Version properties?
  • huseyin tugrul buyukisik
    huseyin tugrul buyukisik over 6 years
    This is good. I'm using it in a winforms project and it is working.
  • Yitzchak
    Yitzchak almost 6 years
    Why do you use Assembly.GetExecutingAssembly()? That returns the current dll, but if I want the main executable I'll call: Assembly.GetEntryAssembly()
  • quetzalcoatl
    quetzalcoatl almost 6 years
    @Yitzchak: Assembly.GetEntryAssembly() returns NULL for example in context of Office Add-ins, and also in many other cases. Also, if you think about addins/plugins - EntryAssembly is the host application, and most often you want the version of YourCode(TM) :) Aside from that, it's worth adding to this answer that assembly.Location used in the answer can be null as well (i.e. first random case googled out: github.com/Azure/azure-functions-host/issues/1233) and that probably happens even more often than having null entry-assembly.
  • David Refoua
    David Refoua over 5 years
    This is exactly what I was looking for, thanks for the answer!
  • Vasya Milovidov
    Vasya Milovidov over 4 years
    I used AssemblyInformationalVersionAttribute instead of AssemblyVersionAttribute on .net core 3.1
  • Momoro
    Momoro about 4 years
    Is there a way to set the file version, instead of just getting it?
  • AH.
    AH. almost 3 years
    Not working. Just returns the AssemblyVersion.
  • jebbie
    jebbie almost 3 years
    wow, unbelievable how hard this is in c#.. in electron i just execute "appVersion: app.getVersion()"... yiiiikes... 🤮