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

522

В AssemblyInfo имеются две версии сборки:

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

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

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

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

  • 2
    Что вы подразумеваете под «версией сборки», а не «версией сборки»? Можете привести пример?
  • 6
    @Xiaofu - «Сборочная версия» - это то, что .NET использует внутренне. «Версия файла сборки» - это то, что отображается, когда вы щелкаете правой кнопкой мыши файл и переходите к «свойствам», а затем к вкладке «Сведения». Они не то же самое.
Показать ещё 1 комментарий
Теги:
version
assemblies

6 ответов

657
Лучший ответ

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

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;
  • 4
    @Xiaofu: Есть ли способ получить номера версий из файла AssemblyInfo.cs?
  • 54
    Одна проблема с этим кодом состоит в том, что он на самом деле вернет 1.0. *. *, Если вы не указали номера сборки и ревизии. AssemblyName.GetAssemblyName (assembly.Location) .Version.ToString (); вы получите «скомпилированный» номер версии, который должен совпадать с FileVersion, если вы устанавливаете обе версии одинаково.
Показать ещё 6 комментариев
113

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

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;
  • 12
    Если когда-нибудь эта запись блога исчезнет когда-нибудь, здесь она сводится для справки: 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;
  • 2
    А для тех, кто хочет указать их в файле AssemblyInfo.cs, для использования assemblyVersion (с любыми нужными номерами) === [assembly: AssemblyVersion("2.0.*")] Для использования fileVersion === [assembly: AssemblyFileVersion("2.0.*")] И для использования productVersion === [assembly: AssemblyInformationalVersion("2.0.*")] Последний может принимать строковый суффикс для совместимости с SemVer : [assembly: AssemblyInformationalVersion("2.0.0-alpha")]
Показать ещё 1 комментарий
47

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

versionlabel.Text = "Version " + Application.ProductVersion;
  • 48
    Обратите внимание, что для этого требуется ссылка на System.Windows.Forms, и поэтому она может не подходить для всех приложений.
  • 2
    К сожалению, это строка. Не идеально, если вы хотите отформатировать его в более простой формат "v1.08". Намного удобнее, если вы на самом деле получаете объект версии, чтобы получить подкомпоненты как целые числа.
Показать ещё 3 комментария
18

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

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

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


public static string GetProductVersion()
{
  var attribute = (AssemblyVersionAttribute)Assembly
    .GetExecutingAssembly()
    .GetCustomAttributes( typeof(AssemblyVersionAttribute), true )
    .Single();
   return attribute.InformationalVersion;
}

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

  • 0
    Привет Рубен, 2 записки. Во-первых, вопрос, заданный для AssemblyFileVersion, а не AssemblyVersion. Во-вторых, Assembly.GetExecutingAssembly (). GetCustomAttributes (typeof (AssemblyVersionAttribute), true) возвращает массив длины 0. Я думаю, это потому, что AssemblyVersionAttribute не является пользовательским атрибутом.
  • 0
    Что касается первого пункта, вот почему я сказал: «Если вы ищете другой атрибут, замените его на вышеприведенный» (IIRC я не пробовал). Во-вторых, это кажется правдоподобным, но у вас нет времени копаться в ...
Показать ещё 2 комментария
2

Используйте это:

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

Или это:

new Version(System.Windows.Forms.Application.ProductVersion);
-4

Вы можете получить версию сборки с My.Application.Info.Version

  • 7
    Это VB, не так ли? Вопрос был для C #.
  • 0
    Я не вижу различий между C # и VB. Вместо этого вы можете вставить этот, эффект будет таким же. Я могу ошибаться.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню