In AssemblyInfo
there are two assembly versions:
AssemblyVersion: Specify the version of the assembly being attributed. 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
?
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;
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;
[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")]
AssemblyFileVersion
may not use the *
suffix notation. :( It needs all four numbers. [assembly: AssemblyFileVersion("2.0.0.1")]
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
.
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)
AssemblyName.Version
property only. But with every other attribute it's the right way to do it
AssemblyInformationalVersionAttribute
instead of AssemblyVersionAttribute
on .net core 3.1
Use this:
((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
Assembly.GetExecutingAssembly(),
typeof(AssemblyFileVersionAttribute), false)
).Version;
Or this:
new Version(System.Windows.Forms.Application.ProductVersion);
Success story sharing
FileVersionInfo
only havestring
properties and noVersion
properties?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 thatassembly.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.