À l'aide de l'Application Web numéro de version à partir d'un assemblage (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.
- "... 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" - je serais curieux de savoir pourquoi vous avez besoin de cela. Je dois dire que je pense que Yodan Tauber solution semble beaucoup plus clair pour moi que l'on a accepté la réponse - si j'avais utiliser
typeof(Global)
plutôt que spécifique à une application nom de la classe. - La méthode de partage de l'assemblée utilisé dans diverses solutions. Ces applications peuvent ou peuvent ne pas être les applications web. De toute façon, j'ai besoin d'être en mesure d'obtenir le numéro de version de l'application, sans réellement le référencement d'une classe au sein de l'application.
- Je trouve que c'est une source de confusion et mal formulé la question, même avec la mise à jour. Si la réponse que vous avez sélectionné est ce que vous êtes vraiment à la recherche de la question doivent être modifiés afin d'éviter toute confusion. Vous devez inclure l'exigence que vous pourriez être appelé par une application web, ET vous n'avez aucune connaissance de la HttpApplication (à l'échelle mondiale.cs) de type ou de tout type au sein de l'assemblée. Si c'est le cas, je voudrais envisager de refactoring cette interface.
Vous devez vous connecter pour publier un commentaire.
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.
Mise à JOUR:
J'ai roulé ce code dans un petit projet sur GitHub et NuGet.
getWebApplicationAssembly
n'a pas fonctionné pour moi 'cause d'un nulIHttpHandler
. Je suis venu avec une version à l'aide dehttpContext.ApplicationInstance
au lieu decontext.CurrentHandler
.Je trouve que le plus simple one-liner façon d'obtenir la version de votre "main" de l'assemblée (au lieu de la dynamique) est:
Utiliser votre haut-niveau de la classe, ce qui n'est pas prêt d' "changer de signification" ou à être remplacé dans le cadre d'un refactoring effort, comme
MyMainClass
. Vous savez dans quel assemblage de cette classe est définie et il n'y a plus de confusion sur l'endroit où le numéro de version vient de.Global
, le code-behind de la classe de base pour le Mondial.asax.Je préfère le Web.Config pour stocker la version actuelle du site.
Vous pouvez également essayer de créer un AssemblyInfo.cs fichier dans la racine de l'application web qui est la suivante:
puis accéder à la valeur via le code comme ceci:
Ici est plus détails sur le AssemblyInfo classe.
System.Reflection.Assembly.GetExecutingAssembly()...
🙂Pour ajouter des intervenants qui ont déjà publié. Afin d'obtenir la version de l'assembly dans un ASP.Net application web, vous devez placer une méthode dans le code de fichier similaires à:
Dans la page ASPX vous souhaitez afficher le numéro de version, il suffit de placer:
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 prendre simplement le
BaseType
deApplicationInstance
pour 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é
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.De Bonus; en utilisant le
BuildManager
classe ne pas de l'HttpContext
instance, ce qui signifie que vous devriez être en mesure d'utiliser cette application code de démarrage ainsi.HttpContext.Actuel.ApplicationInstance est dérivée de la classe dans le monde.asax.cs. Vous pouvez effectuer les opérations suivantes
Il travaille à la fois dans ASP.NET (ASPX) et ASP.NET MVC
J'ai rencontré un problème similaire, et pensé que vous pourriez trouver la solution utile.
J'avais besoin de rapport à l'actuelle version de l'application (d'un projet d'application web) à partir d'un contrôle serveur personnalisé, dans lequel le serveur de contrôle a été contenue dans une autre bibliothèque. Le problème était que le plus "facile" de l'assemblée des getters ne fournissent pas le droit de l'assemblée.
Assembly.GetExecutingAssembly()
retourné l'assemblée contenant le contrôle; non à la demande de l'assemblée.Assembly.GetCallingAssembly()
retourné assemblages différents selon l'endroit où j'en étais dans l'arbre d'appel; habituellement le Système.Web, et parfois de l'assemblée contenant le contrôle.Assembly.GetEntryAssembly()
retournénull
.new StackTrace().GetFrames()[idx].GetMethod().DeclaringType.Assembly
récupère l'assemblage d'une image dans la trace de la pile au niveau de l'indexidx
; cependant, en plus d'être inélégant, coûteuse et sujette à l'erreur de calcul sur le numéro de l'image, il est possible que la trace de la pile à contient pas de tous les appels à la demande de l'assemblée.Assembly.GetAssembly(Page.GetType())
marqué me leApp_Web_@#$@#$%@
assembly contenant la page générée dynamiquement. Bien sûr, la page dynamique hérite d'une classe à partir de mon application assemblée, de sorte que conduit à la solution finale:Avec la référence de l'assemblage à la main, vous pouvez explorer à la version par l'intermédiaire de son nom:
Maintenant, cette solution fonctionne car j'ai eu une référence à un type de la demande de l'assemblée. Nous n'utilisons pas toutes les pages qui ne pas hériter d'un code derrière, il arrive à être efficace pour nous, mais votre kilométrage peut varier, si votre organisation pratiques de codage sont différents.
Bon codage!
Quelques infos ici: http://www.velocityreviews.com/forums/showpost.php?p=487050&postcount=8
Mais j'ai écrit une méthode simple pour le faire:
Si vous êtes à la recherche pour ce à partir d'un contrôle du web, un hack est de trouver le type de la Page code-behind (ie. la classe qui hérite de System.Web.L'INTERFACE utilisateur.Page). C'est normalement à la consommation web de l'assemblée.
J'espère qu'il ya une meilleure façon.
La question des états sans référence (cas), il n'a pas (au départ) de dire n'ayant aucune connaissance du web, les types d'application.
MODIFIER l'OP a précisé à l'état que oui, ils ne nécessitent aucune connaissance des types au sein de l'appelant web de l'assemblée, donc la réponse est appropriée. Cependant, je voudrais envisager sérieusement de refactoring d'une telle solution, tels que la version est passée dans l'autre assemblée.
Pour la plupart des gens dans ce scénario si vous connaissez la coutume HttpApplication type:
et si vous avez seulement une dynamique générée type:
M'empêcher de voter pour cette réponse 🙂