Problema durante il recupero di AssemblyVersion in una pagina Web utilizzando Razor / MVC3


104

Sto usando il codice seguente in un piè di pagina nel mio file _Layout.cshtml per inserire i dati della versione di AssemblyInfo nel piè di pagina di ogni pagina del mio sito MVC3. Però:

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

Stampa solo nel piè di pagina:

Revision 0.0.0.0

Quando ho modificato la visualizzazione per visualizzare tutte le informazioni sull'assembly per "l'assembly in esecuzione" utilizzando quanto segue

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

Che stampa quanto segue:

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

Questo mostra che "Executing Assembly" non è la mia app principale, è la vista stessa.

Come ottengo le informazioni sull'assemblaggio per l'app ACTUAL, non solo le singole visualizzazioni?

Risposte:


218

cshtml / vbhtml è la compilazione dinamica in assembly.

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

cosa ne pensi di questo?


15
E @GetType(YourApplicationNamespace.MvcApplication).Assembly.GetName.Versionper tutti i VB.NETers. Entrambi.
— edhubbell

Devo anche condividere le mie lodi: questa parte superiore della mia storia "mostra il numero di revisione nell'app per qa" insieme a [assembly: AssemblyVersion ("1.0. *")] Ottengo un numero di build dall'aspetto piacevole. Funziona alla grande.
— nocarrier

4
Per i siti WebAPI: @typeof(YourDefaultNamespace.WebApiApplication).Assembly.GetName().Version. Potrebbe anche funzionare senza lo spazio dei nomi predefinito:@typeof(WebApiApplication).Assembly.GetName().Version
— Cristian Diaconescu

@typeof(YourApplicationNamespace.MvcApplication).Assembly.GetName().Version.ToString(3)restituisce 3 delle 4 parti della versione assembly se qualcuno è curioso. Puoi variare tra 0 e 4.
— Mafii

1
in dotnet core 2.1 questo funziona per me: @{Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;}quindi<h1>Ver. @version</h1>
— Leonard AB

16

L'utilizzo di questo aiuto funziona per me:

    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

Questo funziona per me. Senza bisogno di menzionare esplicitamente il tipo.

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

5

È necessario ottenere l'assembly di un tipo nel progetto:

typeof(MyType).Assembly.Whatever

Dove si MyTypetrova un qualsiasi tipo nel progetto MVC stesso (ad esempio, un controller o un modello o la MvcApplicationclasse)


Questa è in realtà una risposta migliore rispetto a quella accettata IMO, poiché rende chiaro che stai cercando un tipo che fa parte dell'assembly della tua applicazione. Una specie di spiega meglio la causa del problema.
— Jim

4

Espandendo la risposta di takepara, se si desidera che un one liner ottenga AssemblyInformationalVersionAttribute da una vista MVC Razor:

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

1

Potresti provare a usare GetCallingAssembly (). Non sono sicuro che sia abbastanza alto nello stack di chiamate o meno, ma poiché Razor crea effettivamente un assembly per ogni visualizzazione, è ovvio che la tua app sarebbe l'assembly chiamante per l'assembly della visualizzazione.


Get Calling assembly va solo di un livello più in alto nell'albero ... ancora non va bene.
— Jay Stevens

1

per un controller API ho usato questo sulla base di altre risposte

Version = GetType().Assembly.GetName().Version.ToString()

0

Il mio problema era che in seguito avevo rinominato lo spazio dei nomi e ho ricevuto l'errore sopra. Il problema era il vecchio riferimento allo spazio dei nomi in Views \ Web.config. Ho dovuto cambiarlo da Project.WebAPI17aCompany.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

Puoi ottenerlo utilizzando la proprietà Name come di seguito:

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

è quello che stai cercando?


-1

Vai su Home Controller e copia semplicemente questo codice:

Rinomina ActionResultin String

public string Index()

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

run view
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.