56 votes

Utilisation du numéro de version de l'application Web à partir d'un assembly (ASP.NET/C#)

Comment puis-je obtenir le numéro de version de l'appel de l'application web dans un assembly référencé?

J'ai essayé d'utiliser le Système.De la réflexion.De l'assemblée.GetCallingAssembly().GetName() mais il me donne juste l'compilé dynamiquement assemblée (de retour d'un numéro de version 0.0.0.0).

Mise à JOUR: Dans mon cas, j'ai besoin d'une solution qui ne nécessite pas de référence à une classe au sein de l'application web de l'assemblée. Jason réponse ci-dessous (marquées comme acceptées) répond à cette exigence - beaucoup d'autres présentés ici ne sont pas.

53voto

Jason Duffett Points 742

Voici quelque code que j'ai utiliser qui prend en charge l'obtention de l'application de la "main" de l'assemblée à partir de Web ou de non-web apps, vous pouvez ensuite utiliser GetName().Version pour avoir la version.

Il tente d'abord GetEntryAssembly() pour les applications web. Cette méthode retourne null en vertu de ASP.NET. Ensuite, il examine HttpContext.Actuel pour déterminer si c'est une application web. Il utilise ensuite le Type de l'actuel HttpHandler - mais ce type de montage peut être généré ASP.NET l'assemblée si l'appel est effectué à partir d'une page ASPX, de sorte qu'il traverse la HttpHandler de BaseType de la chaîne jusqu'à ce qu'il trouve un type qui n'est pas dans l'espace de noms ASP.NET utilise pour ses types générés ("ASP"). Ce sera généralement un type dans votre assemblage principal (par exemple. De la Page dans le fichier code-behind). Nous pouvons alors utiliser le Montage de ce Type. Si tout le reste échoue ensuite retomber à GetExecutingAssembly().

Il y a toujours des problèmes potentiels avec cette approche, mais il fonctionne dans nos applications.

    private const string AspNetNamespace = "ASP";

    private static Assembly getApplicationAssembly()
    {
        // Try the EntryAssembly, this doesn't work for ASP.NET classic pipeline (untested on integrated)
        Assembly ass = Assembly.GetEntryAssembly();

        // Look for web application assembly
        HttpContext ctx = HttpContext.Current;
        if (ctx != null)
            ass = getWebApplicationAssembly(ctx);

        // Fallback to executing assembly
        return ass ?? (Assembly.GetExecutingAssembly());
    }

    private static Assembly getWebApplicationAssembly(HttpContext context)
    {
        Guard.AgainstNullArgument(context);

        object app = context.ApplicationInstance;
        if (app == null) return null;

        Type type = app.GetType();
        while (type != null && type != typeof(object) && type.Namespace == AspNetNamespace)
            type = type.BaseType;

        return type.Assembly;
    }

Mise à JOUR: J'ai roulé ce code dans un petit projet sur GitHub et NuGet.

43voto

Yodan Tauber Points 1661

Je trouve que le moyen le plus simple d'utiliser une seule ligne pour obtenir la version de votre assemblage "principal" (au lieu de l'assemblé dynamique) est:

 typeof(MyMainClass).Assembly.GetName().Version
 

Utilisez votre classe de premier niveau, qui ne risque pas de "changer de signification" ou d'être remplacée dans le cadre d'un effort de refactorisation, en tant que MyMainClass . Vous savez dans quel assembly cette classe est définie et il ne peut plus y avoir de confusion quant à l'origine du numéro de version.

27voto

Ioxp Points 902

Pour les applications web, j'ai toujours utilisé le Web.Config pour stocker la version actuelle du site et un autre paramètre permettant d'afficher/masquer dans le pied de page du site pour le contrôle de version sur la mise en scène et la production.

Vous pouvez également essayer les suivantes:

créer AssemblyInfo.cs fichier dans la racine de l'application web, qui sont les suivantes

using System.Reflection;
using System.Runtime.CompilerServices;
...
[assembly: AssemblyVersion("1.0.*")]
...

ensuite, utilisez

System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString() 

Voici un exemple de ce qu'est un AssemblyInfo.cs devrait ressembler à

14voto

Amir Khawaja Points 154

À ajouter aux répondants qui ont déjà posté. Pour obtenir la version d'assembly dans une application Web ASP.Net, vous devez placer une méthode dans le code derrière un fichier similaire à:

 protected string GetApplicationVersion() {
    return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
}
 

Dans la page ASPX, vous souhaitez afficher le numéro de version, placez simplement:

 <%= GetApplicationVersion() %>
 

8voto

Ron Otten Points 51

Juste au cas où quelqu'un s'est toujours intéressée; ceci devrait faire l'affaire et devrait être un peu plus sûr que de simplement prendre l' BaseType de ApplicationInstance d'obtenir vos mains sur le Global.asax mise en œuvre.

Mondiale.asax est toujours compilé dans la même assemblée que l'assemblée des attributs de AssemblyInfo.cs, donc cela devrait fonctionner pour toutes les applications web qui définissent un Mondial.asax.

Pour ceux qui ne définissent pas leurs propres Mondiale.asax, il reviendra à la version de l'générés global_asax type, qui est toujours 0.0.0.0, et pour les applications qui ne sont pas des applications web, il sera juste de retour pas de version.

Bonus; en utilisant l' BuildManager classe n'a pas besoin d'un actif HttpContext de l'instance, ce qui signifie que vous devriez être en mesure d'utiliser cette application code de démarrage ainsi.

public static Version GetHttpApplicationVersion() {
  Type lBase = typeof(HttpApplication);
  Type lType = BuildManager.GetGlobalAsaxType();

  if (lBase.IsAssignableFrom(lType))
  {
    while (lType.BaseType != lBase) { lType = lType.BaseType; }
    return lType.Assembly.GetName().Version;
  }
  else
  {
    return null;
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X