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?

Réponses:


218

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

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

que dis-tu de ça?


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("");
        }

    }

13

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

@ViewContext.Controller.GetType().Assembly.GetName().Version

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)


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

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.


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()

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>

-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?


-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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.