If you search for “get application version in .NET” or similar, a lot of answers come back telling you to call System.Reflection.Assembly.GetExecutingAssembly() – but this gives you the assembly containing the code that is currently running, which may or may not be the application.
Instead, if you want to get the version information for the application (.exe) that is executing, call System.Reflection.GetEntryAssembly() to return the executable’s Assembly, then call GetName().Version to get the assembly’s version, e.g.
Assembly exeAssembly = Assembly.GetEntryAssembly();
AssemblyName exeName = exeAssembly.GetName();
Version exeVersion = exeName.Version;
string fullVersion = exeVersion.ToString(4);
I finally found the correct answer at msdn, among pages of not-quite-right answers. I hope this helps someone.
Addendum: Gaspode on stackoverflow.com points out that this solution will not always work correctly for applications that use ClickOnce deployment. He offers a workaround here.