Wie kann ich die ausführende Assembly-Version erhalten?

169

Ich versuche, die ausführende Assembly-Version in C # 3.0 mit dem folgenden Code abzurufen:

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

Gibt es einen anderen richtigen Weg, dies zu tun?

user1
quelle

Antworten:

293

Zwei Optionen ... unabhängig vom Anwendungstyp, den Sie jederzeit aufrufen können:

Assembly.GetExecutingAssembly().GetName().Version

Wenn es sich um eine Windows Forms- Anwendung handelt, können Sie jederzeit über eine Anwendung darauf zugreifen, wenn Sie speziell nach einer Produktversion suchen.

Application.ProductVersion

Die Verwendung GetExecutingAssemblyfür eine Baugruppenreferenz ist nicht immer eine Option. Daher finde ich es persönlich nützlich, eine statische Hilfsklasse in Projekten zu erstellen, in denen ich möglicherweise auf die zugrunde liegende Assembly oder Assembly-Version verweisen muss:

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

Dann kann ich CoreAssembly.Versionin meinem Code nach Bedarf sauber referenzieren .

Chris Baxter
quelle
7
Wenn es mit ClickOnce bereitgestellt wird, müssen Sie überprüfenSystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion
Justin Morgan
Was wäre interessant: Wo müssen Sie die aktuelle Version angeben? Ich habe die AssemblyVersion und AssemblyFileVersion in meiner AssemblyInfo.cs angegeben und alles, was ich aus dem oben genannten Methodenaufruf erhalte, ist: 0.0.0.0, obwohl ich 1.0.0
AgentKnopf
@Zainodis Wenn Sie sich auf die ClickOncevon @Justin erwähnte Version beziehen, wird diese auf der PublishRegisterkarte in den Projekteigenschaften angegeben (dh nicht in Bezug auf AssemblyVersion oder AssemblyFileVersion).
Chris Baxter
@CalgaryCoder danke für die Antwort, ich weiß nicht, was ClickOnce ist, aber es stellte sich heraus, dass beim Bearbeiten der AssemblyInfo-Datei über VS plötzlich oO funktioniert hat. Durch manuelles Bearbeiten der AssemblyInfo.cas in einem Texteditor wurden alle Felder leer angezeigt. So oder so, es ist jetzt gelöst :)
AgentKnopf
7
Es ist erwähnenswert, dass dies in ASP.NET MVC-Apps aufgrund des Startkontexts nicht funktioniert. Eine Problemumgehung besteht darin, auf einen bekannten Typ in Ihrer Website-Assembly zu verweisen, z. B. auf die allgegenwärtige MVC HomeController, also in Razor:v@(Assembly.GetAssembly(typeof(MyWebProject.Mvc.Controllers.HomeController)).GetName().Version.ToString(2))
James McCormack
38

In MSDN enthält Assembly.GetExecutingAssembly-Methode eine Bemerkung zur Methode "getexecutingassembly". Aus Leistungsgründen sollten Sie diese Methode nur aufrufen, wenn Sie zur Entwurfszeit nicht wissen, welche Assembly derzeit ausgeführt wird.

Die empfohlene Methode zum Abrufen eines Assembly-Objekts, das die aktuelle Assembly darstellt, besteht darin, die Type.AssemblyEigenschaft eines in der Assembly gefundenen Typs zu verwenden .

Das folgende Beispiel zeigt:

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

Dies ist natürlich der Antwort mit der Hilfsklasse "public static class CoreAssembly" sehr ähnlich, aber wenn Sie mindestens einen Typ der ausführenden Assembly kennen, ist es nicht zwingend erforderlich, eine Hilfsklasse zu erstellen, und dies spart Zeit.

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

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

Die GetEntryAssemblyMethode kann zurückkehren, nullwenn eine verwaltete Assembly aus einer nicht verwalteten Anwendung geladen wurde. Wenn eine nicht verwaltete Anwendung beispielsweise eine Instanz einer in C # geschriebenen COM-Komponente erstellt, wird ein Aufruf der GetEntryAssemblyMethode von der C # -Komponente zurückgegeben null, da der Einstiegspunkt für den Prozess nicht verwalteter Code und keine verwaltete Assembly war.

Hammad Qureshi
quelle
2
+1. GetEntryAssembly(vs GetCallingAssemblyoder GetExecutingAssembly) scheint das einzige zu sein, was funktioniert, wenn es aus einer Referenzbibliothek heraus aufgerufen wird.
Drzaus
6

Dies sollte tun:

Assembly assem = Assembly.GetExecutingAssembly();
AssemblyName aName = assem.GetName();
return aName.Version.ToString();
Elroy Flynn
quelle
5
Diese 3 Zeilen könnten 1 werden: return Assembly.GetExecutingAssembly (). GetName (). Version.ToString (); .............
Alexandre
1

Product Version kann bevorzugt werden, wenn Sie die Versionierung über GitVersion oder eine andere Versionierungssoftware verwenden.

Um dies aus Ihrer Klassenbibliothek herauszuholen, können Sie anrufen System.Diagnostics.FileVersionInfo.ProductVersion:

using System.Diagnostics;
using System.Reflection;

//...

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

Geben Sie hier die Bildbeschreibung ein

Daniel
quelle