Как я могу получить версию файла сборки

727

В AssemblyInfoналичии есть две версии сборки:

  1. AssemblyVersion: Укажите версию атрибутивной сборки.
  2. AssemblyFileVersionУказывает компилятору использовать определенный номер версии для ресурса версии файла Win32. Версия файла Win32 не обязательно должна совпадать с номером версии сборки.

Я могу получить Assembly Versionс помощью следующей строки кода:

Version version = Assembly.GetEntryAssembly().GetName().Version;

Но как я могу получить Assembly File Version?

Enyra
источник
2
Что вы подразумеваете под «версией сборки», а не «версией сборки»? Можете привести пример?
Сяофу
7
@Xiaofu - «Сборочная версия» - это то, что .NET использует внутренне. «Версия файла сборки» - это то, что отображается, когда вы щелкаете правой кнопкой мыши файл и переходите к «свойствам», а затем к вкладке «Сведения». Они не одинаковы.
rory.ap
Я обнаружил, что версия сборки используется для определения местоположения user.config в AppData.
Кайл Делани

Ответы:

867

Смотрите мой комментарий выше с просьбой разъяснить, что вы действительно хотите. Надеюсь, это оно:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;
Xiaofu
источник
4
@Xiaofu: Есть ли способ получить номера версий из файла AssemblyInfo.cs?
Маркус
56
Одна проблема с этим кодом заключается в том, что он на самом деле вернет 1.0. *. *, Если вы не указали номера сборки и ревизии. AssemblyName.GetAssemblyName (assembly.Location) .Version.ToString (); Вы получите «скомпилированный» номер версии, который должен совпадать с FileVersion, если вы устанавливаете обе версии одинаково.
Догухан Улука
17
@DoguhanUluca Это две разные вещи. Это даст вам версию сборки, а не версию файла. «Если вы устанавливаете обе версии одинаково», это обходной путь, а не решение.
Nyerguds
1
Есть FileVersionInfoтолько stringсвойства и нет Versionсвойств?
Кайл Делани
3
@Yitzchak: Assembly.GetEntryAssembly()возвращает NULL, например, в контексте надстроек Office, а также во многих других случаях. Кроме того, если вы думаете о надстройках / плагинах - EntryAssembly является хост-приложением, и чаще всего вам нужна версия YourCode (TM) :) Помимо этого, стоит добавить к этому ответу, что assembly.Locationиспользуемый в ответе также может быть нулевым (т.е. первый случайный случай гуглил: github.com/Azure/azure-functions-host/issues/1233 ) и это, вероятно, случается даже чаще, чем нулевая запись-сборка.
Кецалькоатль
209

Существует три версии : сборка , файл и продукт . Они используются разными функциями и принимают разные значения по умолчанию, если вы не укажете их явно.

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;
Check6
источник
17
Ибо когда этот пост в блоге когда-нибудь исчезнет, ​​здесь он сводится для справки: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;
JMD
3
А для тех, кто хочет указать их в файле AssemblyInfo.cs, для использования assemblyVersion (с любыми [assembly: AssemblyVersion("2.0.*")]нужными числами) === для использования fileVersion === [assembly: AssemblyFileVersion("2.0.*")]и для использования productVersion === [assembly: AssemblyInformationalVersion("2.0.*")] Последний может использовать строковый суффикс для SemVerсовместимости:[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
Джесси Чизхольм
Приложение: AssemblyFileVersionне может использовать *суффиксную нотацию. :( Для этого нужны все четыре числа.[assembly: AssemblyFileVersion("2.0.0.1")]
Джесси Чисхолм
66

Когда я хочу получить доступ к версии файла приложения (что установлено в Сборочной информации -> Версия файла), скажем, чтобы установить для него текст метки при загрузке формы для отображения версии, я только что использовал

versionlabel.Text = "Version " + Application.ProductVersion;
syntap
источник
53
Обратите внимание, что для этого требуется ссылка на System.Windows.Forms, и поэтому она может не подходить для всех приложений.
BradleyDotNET
2
К сожалению, это строка. Не идеально, если вы хотите отформатировать его в более простой формат "v1.08". Гораздо удобнее, если вы на самом деле получаете объект версии для получения подкомпонентов в виде целых чисел.
Nyerguds
1
Кроме того, он получает AssemblyFileVersion из AssemblyInfo, а не AssemblyVersion, так что
будьте внимательны
Может ли пользователь с высоким уровнем репутации редактировать этот ответ, чтобы было понятнее, что это только для Windows Forms?
JRH
Это именно то, что я искал, спасибо за ответ!
Дэвид Рефуа
23

ОБНОВЛЕНИЕ: Как упомянуто Ричардом Граймсом в моем процитированном посте , @Iain и @Dmitry Lobanov, мой ответ верен в теории, но неверен на практике.

Как я должен был помнить из бесчисленных книг и т. Д., В то время как каждый устанавливает эти свойства, используя [assembly: XXXAttribute], они компилируются и помещаются вVERSIONINFO ресурс.

По вышеуказанной причине вам нужно использовать подход в ответе @ Xiaofu, поскольку атрибуты удаляются после извлечения сигнала из них.


открытая статическая строка GetProductVersion ()
{
  var attribute = (AssemblyVersionAttribute) Сборка
    .GetExecutingAssembly ()
    .GetCustomAttributes (typeof (AssemblyVersionAttribute), true)
    .Один();
   return attribute.InformationalVersion;
}

http://bytes.com/groups/net/420417-assemblyversionattribute - как уже отмечалось, если вы ищете другой атрибут, замените его на приведенный выше)

Рубен Бартелинк
источник
Привет Рубен, 2 записки. Во-первых, вопрос, заданный для AssemblyFileVersion, а не AssemblyVersion. Во-вторых, Assembly.GetExecutingAssembly (). GetCustomAttributes (typeof (AssemblyVersionAttribute), true) возвращает массив длины 0. Я думаю, это потому, что AssemblyVersionAttribute не является пользовательским атрибутом.
Иэн
Что касается первого пункта, вот почему я сказал: «Если вы ищете другой атрибут, замените его на вышеприведенный» (IIRC я ​​не пробовал). Во-вторых, это кажется правдоподобным, но у вас нет времени копаться ...
Рубен Бартелинк
Да, вы на самом деле не можете получить атрибут AssemblyVersion через .GetCustomAttribute (), версию сборки можно получить AssemblyName.Versionтолько через свойство. Но с любым другим атрибутом это правильный способ
Дмитрий Лобанов
@DmitryLobanov и Iain Спасибо за подсказки. Я надеюсь, что редактирование достаточно, чтобы сохранить ответ вместо удаления - дайте мне знать!
Рубен Бартелинк
1
Я использовал AssemblyInformationalVersionAttributeвместо AssemblyVersionAttribute.net core 3.1
Вася Миловидов
5

Использовать этот:

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

Или это:

new Version(System.Windows.Forms.Application.ProductVersion);
Питер Гиркенс
источник