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

169

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

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

Есть ли другой правильный способ сделать это?

user1
источник

Ответы:

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 он неожиданно заработал oO. Редактирование 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 - это замечание о методе "getexecutingassembly", которое из соображений производительности следует вызывать этот метод только в том случае, если во время разработки не известно, какая сборка выполняется в данный момент.

Рекомендуемый способ получения объекта Assembly, представляющего текущую сборку, заключается в использовании 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

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

Даниил
источник