Як я можу отримати версію файлу складання


727

В AssemblyInfoє дві складальні версії:

  1. AssemblyVersion: Вкажіть версію збірки, що приписується.
  2. AssemblyFileVersion: Доручає компілятору використовувати певний номер версії для ресурсу версії файлу Win32. Версія файлу Win32 не повинна бути такою ж, як номер версії збірки.

Я можу отримати Assembly Versionнаступний рядок коду:

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

Але як я можу отримати Assembly File Version?


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;

4
@Xiaofu: Чи є спосіб отримати номери версій із файлу AssemblyInfo.cs?
Маркус

56
Одна з проблем цього коду полягає в тому, що він фактично поверне 1.0. *. *, Якщо ви не вказали номери Build and Revision. AssemblyName.GetAssemblyName (Assembly.Location) .Version.ToString (); ви отримаєте номер "складеної" версії - який повинен бути таким же, як і FileVersion, якщо обидві версії ви встановлюєте однаково.
Doguhan Uluca

17
@DoguhanUluca Це дві різні речі. Це дасть вам збірну версію, а не файлову версію. "Якщо ви встановлюєте обидві версії однаково", це рішення, а не рішення.
Nyerguds

1
Має FileVersionInfoтільки stringвластивості і ніяких Versionвластивостей?
Кайл Делані

3
@Yitzchak: Assembly.GetEntryAssembly()повертає NULL, наприклад, у контексті додатків Office, а також у багатьох інших випадках. Крім того, якщо ви думаєте про надбудови / плагіни - EntryAssembly є хост-додатком, і найчастіше ви хочете, щоб версія YourCode (TM) :) Крім цього, до цього відповіді варто додати, що assembly.Locationвикористаний у відповіді також може бути нульовим. (тобто перший випадковий вигул : github.com/Azure/azure-functions-host/isissue/1233 ), і це, мабуть, трапляється навіть частіше, ніж наявність нульового запису-збірки.
quetzalcoatl

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;

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.*")]та для продуктуVersion використання === [assembly: AssemblyInformationalVersion("2.0.*")] Останній може мати суффікс рядка для SemVerсумісності:[assembly: AssemblyInformationalVersion("2.0.0-alpha")]
Джессі Чизгольм

Додаток: AssemblyFileVersionне може використовуватися *позначення суфікса. :( Для цього потрібні всі чотири номери.[assembly: AssemblyFileVersion("2.0.0.1")]
Джессі Чизгольм

66

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

versionlabel.Text = "Version " + Application.ProductVersion;

53
Зауважте, що для цього потрібна посилання на System.Windows.Forms, і тому може бути не підходить для всіх програм.
BradleyDotNET

2
На жаль, це рядок. Не ідеально, якщо ви хочете відформатувати його у більш простий формат "v1.08". Набагато зручніше, якщо ви дійсно отримаєте об’єкт версії, щоб отримати підкомпоненти як цілі числа.
Nyerguds

1
Крім того, це збирає AssemblyFileVersion від AssemblyInfo, а не AssemblyVersion, тому стежте
dario_ramos

Чи міг би користувач із високим представником редагувати цю відповідь, щоб зрозуміти, що це стосується лише Windows Forms?
jrh

Це саме те, що я шукав, дякую за відповідь!
Девід Рефуа

23

ОНОВЛЕННЯ: Як згадував Річард Грімс у своєму цитованому дописі , @Iain та @Dmitry Lobanov, моя відповідь теоретично правильна, але неправильна на практиці.

Як я мав пам’ятати з незліченних книг тощо, хоча один встановлює ці властивості за допомогою [assembly: XXXAttribute], компілятор отримує високі викради і поміщається в VERSIONINFOресурс.

З вищенаведеної причини вам потрібно використовувати підхід у відповіді @ Xiaofu, оскільки атрибути знімаються після вилучення з них сигналу.


загальнодоступна статична рядок GetProductVersion ()
{
  var attribute = (AssemblyVersionAttribute) Асамблея
    .GetExecutingAssembly ()
    .GetCustomAttributes (типof (AssemblyVersionAttribute), true)
    .Single ();
   return attribute.InformationalVersion;
}

http://bytes.com/groups/net/420417-assemblyversionattribute - як зазначено там, якщо ви шукаєте інший атрибут, замініть його на вищезазначене)


Гей Рубен, 2 нотатки. По-перше, питання задавали AssemblyFileVersion не AssemblyVersion. По-друге, Assembly.GetExecutingAssembly (). GetCustomAttributes (typeof (AssemblyVersionAttribute), true) повертає масив довжиною 0. Я думаю, це тому, що AssemblyVersionAttribute не є спеціальним атрибутом.
Iain

По-перше, ось чому я сказав: "Якщо ви шукаєте інший атрибут, замініть це на вище" (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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.