Problem beim Abrufen der AssemblyVersion auf einer Webseite mit Razor / MVC3

103

Ich verwende den folgenden Code in einer Fußzeile in meiner Datei _Layout.cshtml, um die Versionsdaten von AssemblyInfo in die Fußzeile jeder Seite meiner MVC3-Site einzufügen. Jedoch:

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

Druckt einfach in der Fußzeile:

Revision 0.0.0.0

Als ich die Ansicht so geändert habe, dass alle Baugruppeninformationen für die "Ausführung der Baugruppe" wie folgt angezeigt werden

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

Welches druckt das folgende:

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

Dies zeigt, dass die "Executing Assembly" nicht meine Haupt-App ist, sondern die Ansicht selbst.

Wie erhalte ich die Baugruppeninformationen für die IST-App, nicht nur die einzelnen Ansichten?

Jay Stevens
quelle

Antworten:

217

cshtml / vbhtml ist eine dynamische Kompilierung zur Assembly.

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

Wie wäre es damit?

takepara
quelle
15
Und @GetType(YourApplicationNamespace.MvcApplication).Assembly.GetName.Versionfür alle VB.NETer. Wir beide.
Edhubbell
Ich muss auch mein Lob teilen - dies oben in meiner Geschichte "Zeige die Revisionsnummer in der App für QA" zusammen mit [Assembly: AssemblyVersion ("1.0. *")] Erhalte ich eine gut aussehende Build-Nummer. Funktioniert super.
Nocarrier
4
Für WebAPI-Sites : @typeof(YourDefaultNamespace.WebApiApplication).Assembly.GetName().Version. Es kann sogar ohne den Standard-Namespace funktionieren:@typeof(WebApiApplication).Assembly.GetName().Version
Cristian Diaconescu
@typeof(YourApplicationNamespace.MvcApplication).Assembly.GetName().Version.ToString(3)Gibt 3 der 4 Teile der Baugruppenversion zurück, wenn jemand neugierig ist. Sie können zwischen 0 und 4 variieren.
Mafii
1
in dotnet core 2.1 funktioniert das bei mir: @{Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;}dann<h1>Ver. @version</h1>
Leonard AB
16

Die Verwendung dieses Helfers funktioniert für mich:

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

    }
Jay
quelle
13

Das funktioniert bei mir. Ohne den Typ explizit erwähnen zu müssen.

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

Sie müssen die Baugruppe eines Typs im Projekt erhalten:

typeof(MyType).Assembly.Whatever

Wo MyTypebefindet sich ein Typ im MVC-Projekt selbst (z. B. ein Controller oder Modell oder die MvcApplicationKlasse)?

SLaks
quelle
Dies ist tatsächlich eine bessere Antwort als die akzeptierte IMO, da deutlich wird, dass Sie nach einem Typ suchen, der Teil der Assembly Ihrer Anwendung ist. Art erklärt die Ursache des Problems besser.
Jim
4

Erweitern Sie die Antwort von takepara, wenn Sie möchten, dass ein Einzeiler das AssemblyInformationalVersionAttribute aus einer MVC Razor-Ansicht erhält:

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

Sie könnten versuchen, GetCallingAssembly () zu verwenden. Ich bin nicht sicher, ob dies im Aufrufstapel hoch genug ist oder nicht, aber da Razor tatsächlich eine Assembly für jede Ansicht erstellt, liegt es nahe, dass Ihre App die aufrufende Assembly für die Ansichtsassembly ist.

BAKeele
quelle
Get Calling Assembly geht nur eine Ebene höher im Baum ... immer noch nicht gut.
Jay Stevens
0

Mein Problem war, dass ich den Namespace danach umbenannt hatte und den obigen Fehler bekam. Das Problem war die alte Namespace-Referenz in Views \ Web.config. Ich musste es von Project.WebAPI17auf ändernCompany.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
quelle
-1

Sie können es mit der Name-Eigenschaft wie folgt erhalten:

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

ist es das, wonach du suchst?

matmat
quelle
-1

Gehen Sie zu Home Controller und kopieren Sie einfach diesen Code:

In ActionResultString umbenennen

public string Index()

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

run view
prashant
quelle