Problème lors de l'obtention de AssemblyVersion dans une page Web à l'aide de Razor / MVC3

104

J'utilise le code suivant dans un pied de page de mon fichier _Layout.cshtml pour mettre les données de version AssemblyInfo dans le pied de page de chaque page de mon site MVC3. Toutefois:

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

Imprime simplement dans le pied de page:

Revision 0.0.0.0

Lorsque j'ai modifié la vue pour afficher toutes les informations d'assemblage pour "Executing Assembly" en utilisant ce qui suit

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

Qui imprime ce qui suit:

Revision App_Web__layout.cshtml.639c3968.hlogy75x, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

Cela montre que "Executing Assembly" n'est pas mon application principale, c'est la vue elle-même.

Comment obtenir les informations d'assemblage de l'application ACTUAL, pas seulement les vues individuelles?

Jay Stevens
la source

Réponses:

218

cshtml / vbhtml est une compilation dynamique vers l'assembly.

@typeof(YourApplicationNamespace.MvcApplication).Assembly.GetName().Version

que dis-tu de ça?

Takepara
la source
15
Et @GetType(YourApplicationNamespace.MvcApplication).Assembly.GetName.Versionpour tous les VB.NETers. Nous deux.
edhubbell
Je dois aussi partager mes éloges - ceci en tête de mon histoire "Afficher le numéro de révision dans l'application pour qa" avec [assembly: AssemblyVersion ("1.0. *")] J'obtiens un joli numéro de build. Fonctionne très bien.
nocarrier le
4
Pour les sites WebAPI: @typeof(YourDefaultNamespace.WebApiApplication).Assembly.GetName().Version. Cela peut même fonctionner sans l'espace de noms par défaut:@typeof(WebApiApplication).Assembly.GetName().Version
Cristian Diaconescu
@typeof(YourApplicationNamespace.MvcApplication).Assembly.GetName().Version.ToString(3)renvoie 3 des 4 parties de la version d'assemblage si quelqu'un est curieux. Vous pouvez varier entre 0 et 4.
Mafii
1
dans dotnet core 2.1 cela fonctionne pour moi: @{Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;}alors<h1>Ver. @version</h1>
Leonard AB
16

L'utilisation de cet assistant fonctionne pour moi:

    public static HtmlString ApplicationVersion(this HtmlHelper helper)
    {
        var asm = System.Reflection.Assembly.GetExecutingAssembly();
        var version = asm.GetName().Version;
        var product = asm.GetCustomAttributes(typeof(System.Reflection.AssemblyProductAttribute), true).FirstOrDefault() as System.Reflection.AssemblyProductAttribute;

        if (version != null && product != null)
        {
            return new HtmlString(string.Format("<span>{0} v{1}.{2}.{3} ({4})</span>", product.Product, version.Major, version.Minor, version.Build, version.Revision));
        }
        else
        {
            return new HtmlString("");
        }

    }
Geai
la source
13

Cela fonctionne pour moi. Sans avoir besoin de mentionner explicitement le type.

@ViewContext.Controller.GetType().Assembly.GetName().Version
Haohmaru
la source
5

Vous devez obtenir l'assembly d'un type dans le projet:

typeof(MyType).Assembly.Whatever

Où se MyTypetrouve tout type dans le projet MVC lui-même (par exemple, un contrôleur ou un modèle, ou la MvcApplicationclasse)

SLaks
la source
C'est en fait une meilleure réponse que celle acceptée par l'OMI, car elle indique clairement que vous recherchez un type faisant partie de l'assemblage de votre application. En quelque sorte, explique mieux la cause du problème.
Jim
4

Extension de la réponse de takepara, si vous voulez qu'une seule ligne obtienne le AssemblyInformationalVersionAttribute à partir d'une vue MVC Razor:

@System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(Zeroarc.Candid.Web.MvcApplication).Assembly.Location).ProductVersion
jslatts
la source
1

Vous pouvez essayer d'utiliser GetCallingAssembly (). Je ne sais pas si cela est suffisamment élevé dans la pile d'appels ou non, mais puisque Razor crée en fait un assembly pour chaque vue, il va de soi que votre application serait l'assembly appelant pour l'assembly de vue.

BAKeele
la source
L'assemblage Get Calling monte juste d'un niveau dans l'arbre ... toujours pas bon.
Jay Stevens
1

pour un contrôleur api, j'ai utilisé cela en fonction d'autres réponses

Version = GetType().Assembly.GetName().Version.ToString()
workabyte
la source
0

Mon problème était que j'avais renommé l'espace de noms par la suite et j'ai eu l'erreur ci-dessus. Le problème était l'ancienne référence d'espace de noms dans Views \ Web.config. J'ai dû le changer de Project.WebAPI17àCompany.Project.WebAPI17

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="Company.Project.WebAPI17" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>
florian.isopp
la source
-1

Vous pouvez l'obtenir en utilisant la propriété Name comme ci-dessous:

  @System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;

est-ce ce que vous recherchez?

matmat
la source
-1

Allez dans Home Controller et copiez simplement ce code:

Renommer ActionResulten chaîne

public string Index()

   return typeof(Controller).Assembly.GetName().Version.ToString() ;

run view
prashant
la source