Wie lautet die C # -Syntax zum Abrufen des AssemblyInformationalVersionAttributwerts der Assembly zur Laufzeit? Beispiel:
[assembly: AssemblyInformationalVersion("1.2.3.4")]
Antworten:
using System.Reflection.Assembly
using System.Diagnostics.FileVersionInfo
// ...
public string GetInformationalVersion(Assembly assembly) {
return FileVersionInfo.GetVersionInfo(assembly.Location).ProductVersion;
}
mkbundleIhre Bewerbung für Mono
var 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.
GetCustomAttributeanstelle von verwenden, GetCustomAttributeswenn Sie wissen, dass es nur ein Attribut gibt.
Attribute, nicht mit der Instanzmethode vonAssembly
Assembly.GetEntryAssembly()sollte durch Assembly.GetExecutingAssembly()oder ersetzt werden Assembly.GetCallingAssembly(). In der Regel ist dies erforderlich, wenn es sich bei der Assembly um ein Plugin handelt. In diesem Fall GetEntryAssembly()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.Diagnosticsoder dem WinForm- ApplicationObjekt abhängt .
Auch wenn die Frage etwas alt ist:
Ich schlage eine andere Lösung vor, die für mich funktioniert:
Application.ProductVersion
AssemblyInformationalVersionAttribute attribute =
(AssemblyInformationalVersionAttribute)Assembly.GetExecutingAssembly()
.GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false).FirstOrDefault();
if (attribute != null)
Console.WriteLine(attribute.InformationalVersion);
Um die Antwort von Lance zu ergänzen: Sie können Application.ResourceAssembly.Locationden Dateipfad Ihrer Baugruppe ermitteln. Damit ist es möglich, die AssemblyInformationalVersion-Zeichenfolge in nur einer Zeile abzurufen
System.Diagnostics.FileVersionInfo.GetVersionInfo(Application.ResourceAssembly.Location).ProductVersion
http://msdn.microsoft.com/en-us/library/system.reflection.assemblyinformationalversionattribute.aspx
Schauen Sie sich die InformationalVersion-Eigenschaft an
AssemblyVersionAttribute, nicht AssemblyInformationalVersionAttribute.
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.cszusammen mit der Datumszeichenfolge in die Datei schreibt .
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 onGetCustomAttribute<T>(Assembly) .
Assembly.Load(byte[])