Jak mogę uzyskać wersję zestawu wykonawczego?

169

Próbuję uzyskać wersję zestawu wykonującego w C # 3.0 przy użyciu następującego kodu:

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

Czy można to zrobić w inny właściwy sposób?

użytkownik1
źródło

Odpowiedzi:

293

Dwie opcje ... niezależnie od typu aplikacji, którą zawsze możesz wywołać:

Assembly.GetExecutingAssembly().GetName().Version

Jeśli używasz aplikacji Windows Forms , zawsze możesz uzyskać dostęp za pośrednictwem aplikacji, jeśli szukasz konkretnej wersji produktu.

Application.ProductVersion

Korzystanie GetExecutingAssemblyz odwołania do zestawu nie zawsze jest opcją. W związku z tym osobiście uważam za przydatne utworzenie statycznej klasy pomocniczej w projektach, w których może być konieczne odwołanie się do podstawowego zestawu lub wersji zestawu:

// 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;
}

Następnie mogę czysto odwoływać się CoreAssembly.Versiondo mojego kodu zgodnie z wymaganiami.

Chris Baxter
źródło
7
Jeśli jest wdrożony z ClickOnce, musisz to sprawdzićSystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion
Justin Morgan,
Co byłoby interesujące: gdzie należy określić aktualną wersję? Podałem AssemblyVersion i AssemblyFileVersion w moim AssemblyInfo.cs, a wszystko, co otrzymałem z powyższego wywołania to: 0.0.0.0 pomimo określenia 1.0.0
AgentKnopf,
@Zainodis Jeśli odwołujesz się do ClickOncewersji wspomnianej przez @Justin, jest ona określona na Publishkarcie we właściwościach projektu (tj. Niezwiązana z AssemblyVersion lub AssemblyFileVersion).
Chris Baxter,
@CalgaryCoder dzięki za odpowiedź, nie wiem, co to jest ClickOnce, ale okazało się, że podczas edycji pliku AssemblyInfo przez VS, nagle zadziałało oO. Ręczna edycja AssemblyInfo.cas w edytorze tekstu sprawiła, że ​​wszystkie pola stały się puste. Tak czy inaczej, jest już rozwiązany :)
AgentKnopf,
7
Warto wspomnieć, że nie działa to w aplikacjach ASP.NET MVC ze względu na kontekst uruchamiania. Rozwiązaniem jest odniesienie do znanego typu w witrynie montaż, np wszechobecne MVC HomeController, więc w Razor:v@(Assembly.GetAssembly(typeof(MyWebProject.Mvc.Controllers.HomeController)).GetName().Version.ToString(2))
James McCormack
38

W MSDN metoda Assembly.GetExecutingAssembly jest uwagą dotyczącą metody „getexecutingassembly”, że ze względu na wydajność powinieneś wywoływać tę metodę tylko wtedy, gdy nie wiesz w czasie projektowania, jaki zespół aktualnie wykonuje.

Zalecanym sposobem pobrania obiektu Assembly, który reprezentuje bieżący zestaw, jest użycie Type.Assemblywłaściwości typu znalezionego w zestawie.

Poniższy przykład ilustruje:

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

Oczywiście jest to bardzo podobne do odpowiedzi z klasą pomocniczą „publiczna statyczna klasa CoreAssembly”, ale jeśli znasz przynajmniej jeden typ wykonywanego asemblera, tworzenie klasy pomocniczej nie jest obowiązkowe i oszczędza to Twój czas.

Sharunas Bielskis
źródło
19
using System.Reflection;
{
    string version = Assembly.GetEntryAssembly().GetName().Version.ToString();
}

Uwagi z MSDN http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly%28v=vs.110%29.aspx :

GetEntryAssemblyMetoda może powrócić null, gdy udało montaż został załadowany z niezarządzanych aplikacji. Na przykład, jeśli niezarządzana aplikacja tworzy wystąpienie składnika COM napisane w języku C #, wywołanie GetEntryAssemblymetody ze składnika C # zostanie zwrócone null, ponieważ punktem wejścia dla procesu był kod niezarządzany, a nie zarządzany zestaw.

Hammad Qureshi
źródło
2
+1. GetEntryAssembly(vs GetCallingAssemblylub GetExecutingAssembly) wydaje się być jedyną rzeczą, która działa, gdy jest wywoływana z biblioteki referencyjnej.
drzaus
6

To powinno wystarczyć:

Assembly assem = Assembly.GetExecutingAssembly();
AssemblyName aName = assem.GetName();
return aName.Version.ToString();
Elroy Flynn
źródło
5
te 3 wiersze mogą stać się 1: return Assembly.GetExecutingAssembly (). GetName (). Version.ToString (); .............
Alexandre
1

Product Version może być preferowane, jeśli używasz wersjonowania przez GitVersion lub inne oprogramowanie do wersjonowania.

Aby uzyskać to z biblioteki zajęć, możesz zadzwonić System.Diagnostics.FileVersionInfo.ProductVersion:

using System.Diagnostics;
using System.Reflection;

//...

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

wprowadź opis obrazu tutaj

Daniel
źródło