Як я можу отримати версію, що виконує збірку?


169

Я намагаюся отримати версію збірки, виконану в C # 3.0, використовуючи наступний код:

var assemblyFullName = Assembly.GetExecutingAssembly().FullName;
var version = assemblyFullName .Split(',')[1].Split('=')[1];

Чи існує інший правильний спосіб зробити це?

Відповіді:


293

Два варіанти ... незалежно від типу програми, яку завжди можна викликати:

Assembly.GetExecutingAssembly().GetName().Version

Якщо програма Windows Forms , ви завжди можете отримати доступ через додаток, якщо шукати спеціально для версії продукту.

Application.ProductVersion

Використання GetExecutingAssemblyдля посилання на збірку - це не завжди варіант. Тому я особисто вважаю корисним створити статичний клас помічників у проектах, де мені може знадобитися посилання на базову версію або збірку:

// A sample assembly reference class that would exist in the `Core` project.
public static class CoreAssembly
{
    public static readonly Assembly Reference = typeof(CoreAssembly).Assembly;
    public static readonly Version Version = Reference.GetName().Version;
}

Тоді я можу чітко вказати CoreAssembly.Versionсвій код у міру необхідності.


7
Якщо він розгорнутий із ClickOnce, вам потрібно перевіритиSystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion
Джастін Морган

Що було б цікаво: де потрібно вказати фактичну версію? Я вказав AssemblyVersion і AssemblyFileVersion у своєму AssemblyInfo.cs, і все, що я отримую від вищезазначеного виклику методу, це: 0.0.0.0, незважаючи на те, що вказано 1.0.0
AgentKnopf

@Zainodis Якщо ви посилаєтесь на ClickOnceверсію, згадану @Justin, вона вказана на Publishвкладці у межах властивостей проекту (тобто не стосується AssemblyVersion або AssemblyFileVersion).
Кріс Бакстер

@CalgaryCoder спасибі за відповідь, я не знаю, що таке ClickOnce, але виявилося, що редагувати файл AssemblyInfo через VS, то він раптом спрацював. Редагування AssemblyInfo.cas вручну в текстовому редакторі зробило всі поля порожніми. Так чи інакше, це вирішено зараз :)
AgentKnopf

7
Варто зазначити, що це не працює в програмах ASP.NET MVC через контекст запуску. Вирішення питання полягає у посиланні на відомий тип у складі вашого веб-сайту, наприклад, на всюдисущий MVC HomeController, так що у Razor:v@(Assembly.GetAssembly(typeof(MyWebProject.Mvc.Controllers.HomeController)).GetName().Version.ToString(2))
Джеймс Маккормак

38

У MSDN, Assembly.GetExecutingAssembly метод , це зауваження щодо методу "getexecutingasse збільшити", що з міркувань продуктивності ви повинні викликати цей метод лише тоді, коли ви не знаєте на час проектування, яку збірку зараз виконує.

Рекомендований спосіб отримати об'єкт зборки, який представляє поточну збірку, - це використовувати Type.Assemblyвластивість типу, знайденого в збірці.

Наступний приклад ілюструє:

using System;
using System.Reflection;

public class Example
{
    public static void Main()
    {
        Console.WriteLine("The version of the currently executing assembly is: {0}",
                          typeof(Example).Assembly.GetName().Version);
    }
}

/* This example produces output similar to the following:
   The version of the currently executing assembly is: 1.1.0.0

Звичайно, це дуже схоже на відповідь з допоміжним класом "публічний статичний клас CoreAssembly", але, якщо ви знаєте хоча б один тип виконавчої збірки, створювати хелперний клас не обов'язково, і це економить ваш час.


19
using System.Reflection;
{
    string version = Assembly.GetEntryAssembly().GetName().Version.ToString();
}

Зауваження від MSDN http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly%28v=vs.110%29.aspx :

GetEntryAssemblyМетод може повернутися , nullколи керована збірка була завантажена з некерованого додатки. Наприклад, якщо некерований додаток створює екземпляр компонента COM, записаний на C #, виклик GetEntryAssemblyметоду з компонента C # повертається null, тому що точкою входу для процесу був некерований код, а не керована збірка.


2
+1. GetEntryAssembly(vs GetCallingAssemblyабо GetExecutingAssembly), здається, єдине, що працює, коли викликається з довідкової бібліотеки.
drzaus

6

Це слід зробити:

Assembly assem = Assembly.GetExecutingAssembly();
AssemblyName aName = assem.GetName();
return aName.Version.ToString();

5
ці 3 рядки можуть стати 1: return Assembly.GetExecutingAssembly (). GetName (). Version.ToString (); .............
Олександр

1

Нарешті я зупинився на typeof(MyClass).GetTypeInfo().Assembly.GetName().Versionдодатку netstandard1.6. Усі інші запропоновані відповіді представляли часткове рішення. Це єдине, що отримало від мене саме те, що мені було потрібно.

Виділено з комбінації місць:

https://msdn.microsoft.com/en-us/library/x4cw969y(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/2exyydhb(v=vs.110).aspx


1

Product Version може бути кращим, якщо ви використовуєте версію через GitVersion або інше програмне забезпечення для версій.

Щоб отримати це з бібліотеки класів, ви можете зателефонувати System.Diagnostics.FileVersionInfo.ProductVersion:

using System.Diagnostics;
using System.Reflection;

//...

var assemblyLocation = Assembly.GetExecutingAssembly().Location;
var productVersion = FileVersionInfo.GetVersionInfo(assemblyLocation).ProductVersion

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.