Wie lautet die C # -Syntax zum Abrufen des AssemblyInformationalVersion
Attributwerts der Assembly zur Laufzeit? Beispiel:
[assembly: AssemblyInformationalVersion("1.2.3.4")]
using System.Reflection.Assembly
using System.Diagnostics.FileVersionInfo
// ...
public string GetInformationalVersion(Assembly assembly) {
return FileVersionInfo.GetVersionInfo(assembly.Location).ProductVersion;
}
Assembly.Load(byte[])
mkbundle
Ihre Bewerbung für Monovar attr = Assembly .GetEntryAssembly() .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false) as AssemblyInformationalVersionAttribute[];
Es ist eine Reihe von
AssemblyInformationalVersionAttribute
. Es ist niemals null, selbst wenn es kein Attribut des gesuchten Typs gibt.var attr2 = Attribute .GetCustomAttribute( Assembly.GetEntryAssembly(), typeof(AssemblyInformationalVersionAttribute)) as AssemblyInformationalVersionAttribute;
Dies kann null sein, wenn das Attribut nicht vorhanden ist.
var attr3 = Attribute .GetCustomAttributes( Assembly.GetEntryAssembly(), typeof(AssemblyInformationalVersionAttribute)) as AssemblyInformationalVersionAttribute[];
Gleich wie zuerst.
quelle
GetCustomAttribute
anstelle von verwenden,GetCustomAttributes
wenn Sie wissen, dass es nur ein Attribut gibt.Attribute
, nicht mit der Instanzmethode vonAssembly
Assembly.GetEntryAssembly()
sollte durchAssembly.GetExecutingAssembly()
oder ersetzt werdenAssembly.GetCallingAssembly()
. In der Regel ist dies erforderlich, wenn es sich bei der Assembly um ein Plugin handelt. In diesem FallGetEntryAssembly()
wird die Assembly der Hostanwendung zurückgegeben.Mit einem bekannten Typ in Ihrer Anwendung können Sie dies einfach tun:
using System.Reflection; public static readonly string ProductVersion = typeof(MyKnownType).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion;
Natürlich ist jeder Prozess, mit dem Sie zu der Assembly gelangen, auf die Ihr Attribut angewendet wird, gut. Beachten Sie, dass dies nicht vom
System.Diagnostics
oder dem WinForm-Application
Objekt abhängt .quelle
Auch wenn die Frage etwas alt ist:
Ich schlage eine andere Lösung vor, die für mich funktioniert:
quelle
AssemblyInformationalVersionAttribute attribute = (AssemblyInformationalVersionAttribute)Assembly.GetExecutingAssembly() .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false).FirstOrDefault(); if (attribute != null) Console.WriteLine(attribute.InformationalVersion);
quelle
Um die Antwort von Lance zu ergänzen: Sie können
Application.ResourceAssembly.Location
den Dateipfad Ihrer Baugruppe ermitteln. Damit ist es möglich, die AssemblyInformationalVersion-Zeichenfolge in nur einer Zeile abzurufenquelle
http://msdn.microsoft.com/en-us/library/system.reflection.assemblyinformationalversionattribute.aspx
Schauen Sie sich die InformationalVersion-Eigenschaft an
quelle
AssemblyVersionAttribute
, nichtAssemblyInformationalVersionAttribute
.Aufbauend auf der Antwort von @ Aerthal, wenn Sie möchten, dass ein Einzeiler das AssemblyInformationalVersionAttribute aus einer MVC Razor-Ansicht erhält:
@System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(Zeroarc.Candid.Web.MvcApplication).Assembly.Location).ProductVersion
quelle
Ein praktischer Ansatz
Da das Abrufen des Datums aus dem PE-Header möglicherweise nicht zuverlässig genug ist, können Sie Ihrem Attribut zusätzliche Attribute hinzufügen
AssemblyInfo.cs
[assembly: AssemblyVersion("1.0.0")] [assembly: AssemblyFileVersion("1.0.0")] // and this: [assembly: AssemblyInformationalVersion("1.0.0 (Build Date: 14.07.2020)")]
Die Zeichenfolge sollte lesbar sein, da sie für den Endbenutzer sichtbar ist. Wenn Sie sich jedoch an ein bestimmtes Format halten, kann es einfach und zuverlässig analysiert werden .
Hinweis: Wir verwenden einen Jenkins-Buildserver, der Versionsinformationen
AssemblyInfo.cs
zusammen mit der Datumszeichenfolge in die Datei schreibt .quelle
public static string GetInformationalVersion() => Assembly .GetEntryAssembly() .GetCustomAttribute<AssemblyInformationalVersionAttribute>() .InformationalVersion;
Obwohl meine Antwort einigen der anderen ähnlich ist, denke ich, dass sie einige Vorteile hat:
GetEntryAssembly()
mitGetExecutingAssembly()
GetCustomAttribute<T>
besser und denke, dass diese Variante besser lesbar ist.Siehe auch Microsoft Docs on
GetCustomAttribute<T>(Assembly)
.quelle