Подтвердить что ты не робот

Как получить номер версии файла .exe из пути к файлу

Я использую .Net 3.5/4.0 с кодом на С#.

Я пытаюсь получить номер версии исполняемого файла на моем диске C :.

Например, путь: c:\Program\demo.exe. Если номер версии demo.exe равен 1.0.

Как я могу использовать этот путь, чтобы получить номер версии?

4b9b3361

Ответ 1

Вы можете использовать FileVersionInfo.ProductVersion, чтобы извлечь это из пути.

var versionInfo = FileVersionInfo.GetVersionInfo(pathToExe);
string version = versionInfo.ProductVersion; // Will typically return "1.0.0" in your case

Ответ 2

Обновлен и модернизирован 2018 год (например, интерполяция строк в С# 6):

Принятый ответ частично неверен (ProductVersion обычно не возвращает трехчастную версию) и немного вводит в заблуждение:

Вот более полный ответ. Чтобы основной текст не был слишком длинным, я разделил его на краткое (э) резюме, которое может быть "достаточно" для многих людей. Вы не обязаны читать подробную вторую часть, поэтому, пожалуйста, не пишите; dr :-)

Краткое резюме:

  1. Существуют разные версии (версия сборки, версия файла, версия продукта) каждого файла, но обычно у вас все они равны, чтобы не получить "адскую версию" уже на уровне файла (это произойдет достаточно рано).

  2. Версия файла (которая видна в Проводнике и используется в настройках/установках) - это то, что я бы назвал наиболее важным.

  3. Для этого просто закомментируйте версию файла в файле AssemblyInfo.cs, как показано ниже. Это гарантирует, что три возможных разных версии одного файла одинаковы!

    [Assembly: AssemblyVersion ("1.1.2.")]
      //[assembly: AssemblyFileVersion ("1.1.2.")]

  4. Например. для семантического управления версиями вы хотите получить только 3 части версии из возможных 4:

Полезно иметь автоматический подсчет сборок для каждой сборки Visual Studio. Но этот подсчет сборок не всегда полезен для ваших клиентов, внутренних или внешних. Так что для упоминания версии файла для окон, в диалоговых окнах заголовков я бы посоветовал показать только три части 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.

D e t a i l s:

Во-первых, шпаргалка о том, как получить и установить три версии:

Версия файла: [assembly: AssemblyFileVersion (..)] => System.Diagnostics.FileVersionInfo.FileVersion

Версия продукта: [assembly: AssemblyInformationalVersion (..)] => System.Diagnostics.FileVersionInfo.ProductVersion

Версия сборки: [assembly: AssemblyVersion (..)] => System.Reflection.Assembly.Version

Особенно дефолт может сбить с толку. Рекомендуемая ссылка SO для понимания деталей: FileVersionInfo и AssemblyInfo

EntryAssembly против ExecutingAssembly
Чтобы полностью рассмотреть каждый случай получения версии работающего приложения, найдите другие детали, например, в другом месте. Вот: Что лучше для получения местоположения сборки, GetAssembly(). Location или GetExecutingAssembly(). Местоположение
В частности, может возникнуть путаница, если нужно использовать 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, версия файла более актуальна для классических установок, например, перезапись во время обновлений или для общих файлов.

Ответ 3

В принятом ответе делается ссылка на "pathToExe".

Этот путь можно найти и использовать следующим образом:

var assembly = Assembly.GetExecutingAssembly();
var fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
var version = fvi.FileVersion; // or fvi.ProductVersion

Надеюсь, это спасет кого-то от лишних лишних шагов.

Ответ 4

Где Program - ваше имя класса:

Console.WriteLine("Version = " + typeof(Program).Assembly.GetName().Version.ToString()) ;

Ответ 5

Я не уверен, что это то, что вы ищете, но:

http://www.daniweb.com/software-development/csharp/threads/276174/c-code-to-get-dll-version

Там сказано:

// Get the file version info for the notepad.
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);

Ответ 6

Используйте, он работает:

using System.Reflection;

string v = AssemblyName.GetAssemblyName("Path/filename.exe").Version.ToString();

Ответ 7

//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