ChatGPT解决这个技术问题 Extra ChatGPT

How can I get the assembly file version

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?

What do you mean by "assembly file version" as opposed to "assembly version"? Can you give an example?
@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.
I've found that the assembly version is what's used when determining the user.config location in AppData.

b
billinkc

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;

@Xiaofu: Is there any way to get the version numbers from a AssemblyInfo.cs file instead?
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.ToString(); will get you the 'compiled' version number - which should be the same as FileVersion, if you're setting both versions the same way.
@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.
Does FileVersionInfo only have string properties and no Version properties?
@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.
j
juergen d

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;

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")]
Addendum: AssemblyFileVersion may not use the * suffix notation. :( It needs all four numbers. [assembly: AssemblyFileVersion("2.0.0.1")]
t
thatguy

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.


Note that this requires a reference to System.Windows.Forms, and so might not be suitable for all applications.
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.
Also, this picks up AssemblyFileVersion from AssemblyInfo, not AssemblyVersion, so watch out
Could a high rep user edit this answer to make it more clear that this is for Windows Forms only?
This is exactly what I was looking for, thanks for the answer!
R
Ruben Bartelink

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)


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.
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...
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
@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!
I used AssemblyInformationalVersionAttribute instead of AssemblyVersionAttribute on .net core 3.1
P
Pieter Geerkens

Use this:

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

Or this:

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