2011-10-14 2 views

Répondre

53
using System.Reflection.Assembly 
using System.Diagnostics.FileVersionInfo 

// ... 

public string GetInformationalVersion(Assembly assembly) { 
    return FileVersionInfo.GetVersionInfo(assembly.Location).ProductVersion; 
} 
+0

Voir http://stackoverflow.com/a/19008850/116895 – lance

+7

Notez que ce code ne fonctionne pas si l'assembly n'a pas été chargé à partir d'un fichier ou d'un UNC. Cela peut être le cas si l'assembly est incorporé dans un autre assembly (généralement lors de l'obfuscation d'assemblys) ou pour une autre raison a été chargé en utilisant 'Assembly.Load (byte [])' – larsmoa

+2

Ne fonctionne pas si vous avez 'mkbundle '' d votre application pour Mono – Cocowalla

34
var attr = Assembly 
    .GetEntryAssembly() 
    .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false) 
    as AssemblyInformationalVersionAttribute[]; 

Il est un tableau de AssemblyInformationalVersionAttribute. Ce n'est jamais nul même s'il n'y a aucun attribut du type recherché.

var attr2 = Attribute 
    .GetCustomAttribute(
     Assembly.GetEntryAssembly(), 
     typeof(AssemblyInformationalVersionAttribute)) 
    as AssemblyInformationalVersionAttribute; 

Ceci peut être nul si l'attribut n'est pas présent.

var attr3 = Attribute 
    .GetCustomAttributes(
     Assembly.GetEntryAssembly(), 
     typeof(AssemblyInformationalVersionAttribute)) 
    as AssemblyInformationalVersionAttribute[]; 

Identique à la première.

+1

+1; mais vous pouvez utiliser 'GetCustomAttribute' au lieu de' GetCustomAttributes' si vous savez qu'il n'y aura qu'un seul attribut. – vcsjones

+3

@vcsjones Seulement en utilisant la méthode statique de 'Attribute', n'utilisant pas la méthode d'instance de' Assembly' – xanatos

+1

Dans certaines situations, 'Assembly.GetEntryAssembly()' devrait être remplacé par 'Assembly.GetExecutingAssembly()' ou 'Assembly. GetCallingAssembly() '. Généralement, cela est nécessaire si l'assembly est un plugin - dans ce cas 'GetEntryAssembly()' retournera l'assembly d'application hôte. – larsmoa

7
AssemblyInformationalVersionAttribute attribute = 
    (AssemblyInformationalVersionAttribute)Assembly.GetExecutingAssembly() 
    .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false).FirstOrDefault(); 

if (attribute != null) 
    Console.WriteLine(attribute.InformationalVersion); 
+0

+1 car cela fonctionne également avec Silverlight ou Xbox Lakeview! – ahilsend

10

Même si la question est un peu vieux:

Je propose une autre solution qui fonctionne pour moi:

Application.ProductVersion 
+4

J'ai eu du mal à le trouver dans WPF, c'est la classe Winforms Application. :-) – Wouter

3

Pour compléter la réponse de lance: Vous pouvez utiliser Application.ResourceAssembly.Location à trouvez le chemin du fichier de votre assembly. Avec cela, il est possible d'obtenir la chaîne de AssemblyInformationalVersion en une seule ligne

System.Diagnostics.FileVersionInfo.GetVersionInfo(Application.ResourceAssembly.Location).ProductVersion 
8

L'utilisation d'un type connu dans votre application, vous pouvez simplement faire ceci:

using System.Reflection; 

public static readonly string ProductVersion = typeof(MyKnownType).Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion; 

Bien sûr tout processus que vous utilisez pour obtenir la l'assemblage de votre attribut est bon. Notez que cela ne dépend pas de System.Diagnostics ou de l'objet Application de WinForm.

0

hors de @ bâtiment réponse de Aerthal, si vous voulez une seule ligne pour obtenir le AssemblyInformationalVersionAttribute d'un MVC Razor Voir:

@System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(Zeroarc.Candid.Web.MvcApplication).Assembly.Location).ProductVersion 
Questions connexes