Как получить номер версии файла.exe из пути к файлу
Я использую.Net 3.5/4.0 с кодом в C#.
Я пытаюсь получить номер версии исполняемого файла на моем диске C:.
Например, путь: c:\Program\demo.exe. Если номер версии demo.exe равен 1.0.
Как я могу использовать этот путь, чтобы получить номер версии?
8 ответов
Вы можете использовать FileVersionInfo.ProductVersion, чтобы извлечь это из пути.
var versionInfo = FileVersionInfo.GetVersionInfo(pathToExe);
string version = versionInfo.ProductVersion; // Will typically return "1.0.0" in your case
Обновлен и модернизирован 2018 (например, интерполяция строк в C#6):
Принятый ответ частично неверен (ProductVersion обычно не возвращает трехчастную версию) и немного вводит в заблуждение:
Вот более полный ответ. Чтобы основной текст не был слишком длинным, я разбил его на краткое (э) резюме, которое может быть "достаточно" для многих людей. Вы не обязаны читать подробную вторую часть, поэтому, пожалуйста, не пишите;dr:-)
Краткое содержание:
Существуют разные версии (версия сборки, версия файла, версия продукта) каждого файла, но обычно у вас все они равны, чтобы не получить "адскую версию" уже на уровне файла (это произойдет достаточно рано).
Версия файла (которая видна в Проводнике и используется в настройках / установках)- это то, что я бы назвал наиболее важным.
Для этого просто закомментируйте fileversion в файле AssemblyInfo.cs, как показано ниже. Это гарантирует, что три возможных разных версии одного файла одинаковы!
[сборка: AssemblyVersion ("1.1.2. ")]
// [assembly: AssemblyFileVersion ("1.1.2. ")]Например, для семантического версионирования вы хотите получить только 3 части версии из 4 возможных:
Полезно иметь автоматический подсчет сборок для каждой сборки Visual Studio. Но этот подсчет сборок не всегда полезен для ваших клиентов, внутренних или внешних. Так что для упоминания версии файла в windows, в диалоговых окнах заголовков я бы посоветовал показать только три части v1.2.3 (и, конечно, с семантической версией):
using System.Diagnostics;
...
var versInfo= FileVersionInfo.GetVersionInfo(pathToVersionedFile);
string fileVersionFull = versInfo.FileVersion; // No difference here for versinfo.ProductVersion if recommendation in AssemblyInfo.cs is followed
string fileVersionSemantic = $"V{versInfo.FileMajorPart}.{versInfo.FileMinorPart}.{versInfo.FileBuildPart}";
string fileVersionFull2 = $"V{versInfo.FileMajorPart}.{versInfo.FileMinorPart}.{versInfo.FileBuildPart}.{versInfo.FilePrivatePart}";
FileVersionFull2 просто показывает, как обрабатывать все 4 части, кроме "V", он содержит то же самое, что и FileVersionFull.
Подробности:
Во-первых, шпаргалка о том, как получить и установить три версии:
Версия файла: [Assembly: AssemblyFileVersion(..)] => System.Diagnostics.FileVersionInfo.FileVersion
Версия продукта: [сборка: AssemblyInformationalVersion(..)] => System.Diagnostics.FileVersionInfo.ProductVersion
Версия сборки : [assembly: AssemblyVersion (..)] => System.Reflection.Assembly.Version
Особенно дефолт может сбить с толку. Рекомендуемая SO ссылка для понимания деталей: FileVersionInfo и AssemblyInfo
EntryAssembly против ExecutingAssembly
Чтобы полностью рассмотреть каждый случай получения версии работающего приложения, поищите в другом месте более подробную информацию, например, здесь: что лучше для получения местоположения сборки, GetAssembly().Location или GetExecutingAssembly().Location
В частности, может возникнуть путаница, если нужно использовать EntryAssembly или ExecutingAssembly. У них обоих есть свои преимущества и недостатки. Если у вас есть следующий код не в той же сборке, что и.exe, например, во вспомогательной сборке, все становится сложнее. Обычно тогда вы используете EntryAssembly, чтобы получить версию.exe.
Но: Для модульных тестов в Visual Studio для тестирования подпрограмм в параллельном.exe-проекте GetEntryAssembly() не работает (мой env: NUnit, VS2017). Но GetExecutingAssembly () по крайней мере не дает сбоя, только во время модульного тестирования вы получаете версию сборки тестового проекта. Хорошо для меня. Могут быть ситуации, которые не так просты.
При желании вы можете опустить объявление как статическое, что делает возможным получение версий нескольких различных сборок в одной программе.
public static class AppInfo
{
public static string FullAssemblyName { get; }
..
static AppInfo()
{
Assembly thisAssembly = null;
try
{
thisAssembly = Assembly.GetEntryAssembly();
}
finally
{
if (thisAssembly is null)
thisAssembly = Assembly.GetExecutingAssembly();
}
FullAssemblyName = thisAssembly.Location;
var versInfo = FileVersionInfo.GetVersionInfo(FullAssemblyName);
..
}
}
Версия продукта и версия файла:
ProductVersion файла также отображается в проводнике Windows. Я бы порекомендовал максимально различать ProductVersion и FileVersion в наиболее "видимом для клиента" файле (в основном это основной.exe приложения). Но это, конечно, может быть выбор для каждого файла "основного" приложения, чтобы у всех них была "маркетинговая" версия продукта, которую видит клиент. Но опыт показывает, что не нужно и не дешево пытаться синхронизировать технические версии и маркетинговые версии слишком много. Путаница на самом деле не уменьшается, расходы увеличиваются. Таким образом, решение, описанное в первой части, должно делать это в основном.
История: версия сборки и версия файла. Одной из причин наличия разных версий также является то, что одна сборка.NET изначально может состоять из нескольких файлов (модулей)- теоретически. Это не используется Visual Studio и очень редко используется в других местах. Это, возможно, одна из исторических причин предоставления возможности дифференцировать эти две версии. Технически версия сборки относится к версиям, связанным с.NET, как к версиям GAC и Side-by-side, версия файла больше подходит для классических установок, например, перезаписи во время обновлений или для общих файлов.
В принятом ответе делается ссылка на "pathToExe".
Этот путь можно найти и использовать следующим образом:
var assembly = Assembly.GetExecutingAssembly();
var fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
var version = fvi.FileVersion; // or fvi.ProductVersion
Надеюсь, это спасет кого-то от лишних лишних шагов.
Куда Program
Ваше имя класса:
Console.WriteLine("Version = " + typeof(Program).Assembly.GetName().Version.ToString()) ;
Я не уверен, что это то, что вы ищете, но:
http://www.daniweb.com/software-development/csharp/threads/276174/c-code-to-get-dll-version
Это говорит
int i;
// Get the file version for the notepad.
FileVersionInfo.GetVersionInfo(Path.Combine(Environment.SystemDirectory, "notepad.exe"));
FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(Environment.SystemDirectory + "\\notepad.exe");
// Print the file name and version number.
Console.WriteLine("File: " + myFileVersionInfo.FileDescription + '\n' + "Version number: " + myFileVersionInfo.FileVersion);
Используйте, это работает:
using System.Reflection;
string v = AssemblyName.GetAssemblyName("Path/filename.exe").Version.ToString();
Это работает хорошо и возвращает версию, указанную в AssemblyVersion:
using System.Reflection;
infoFileVersionInfo versInfo = FileVersionInfo.GetVersionInfo(Environment.CurrentDirectory + "\\Fortnitify Launcher.exe");
string version = $"v{versInfo.FileMajorPart}.{versInfo.FileMinorPart}.{versInfo.FileBuildPart}";
//Example your file version is 1.0.0.0
//Solution 1
Dim fileVer As FileVersionInfo = FileVersionInfo.GetVersionInfo(Environment.CurrentDirectory + "\yourExe.exe")
yourLabel.Text = fileVer.FileVersion
//Solution 2
//Get File Version Number
yourLabel.Text = Application.ProductVersion
//Both solution will get output 1.0.0.0