2010-05-12 3 views
29

Ich verwende die automatische Build-Versionierung, die in this question erwähnt wird (nicht die ausgewählte Antwort, sondern die Antwort, die die [assembly: AssemblyVersion("1.0.*")]-Technik verwendet). Ich tue dies in der Fußzeile meiner Site.Master Datei in MVC 2. Mein Code, dies zu tun ist wie folgt:Assemblyversion für Fußzeile kann nicht abgerufen werden

<div id="footer"> 
    <a href="emailto:[email protected]">[email protected]</a> - Copyright © 2005-<%= DateTime.Today.Year.ToString() %>, foo LLC. All Rights Reserved. 
    - Version: <%= Assembly.GetEntryAssembly().GetName().Version.ToString() %> 
</div> 

Die Ausnahme, die ich bekommen, ist eine Object reference not set to an instance of an object weil GetEntryAssembly() kehrt NULL. Meine anderen Optionen funktionieren auch nicht. GetCallingAssembly() gibt immer "4.0.0.0" zurück und GetExecutingAssembly() gibt immer "0.0.0.0" zurück. Wenn ich meine DLLs anschaue, wird alles versioniert, wie ich es erwarten würde. Aber ich kann nicht herausfinden, wie man darauf zugreifen kann, um in meiner Fußzeile angezeigt zu werden !!

+0

'Assembly.GetAssembl. y (this.GetType()). GetName(). Version.ToString() 'gibt auch" 0.0.0.0 "zurück – Jaxidian

+0

GetEntryAssembly() kann auch null zurückgeben, wenn die Assembly aus dem nicht verwalteten Code http://msdn.microsoft aufgerufen wird .com/de-de/library/system.reflection.assembly.getentryassembly.aspx – GenEric35

+0

und w3wp.exe ist in der Tat nicht verwaltet, Modul 'w3wp.exe' enthält keine CLI-Header – GenEric35

Antwort

56

Das ist, weil Assembly.GetEntryAssembly() null zurückkehrt: dort ist keine „Eintrag“ Baugruppe in einer ASP.NET-Website (weil der .NET-Framework ist in dem w3wp.exe-Prozess gehostet). Assembly.GetEntryAssembly() verwendet wird, um die Exe-Baugruppe zu erhalten, die Sie aus (in der Regel in einer Konsole oder Windows-Anwendung) gestartet

Der Grund Assembly.GetAssembly(this.GetType()) ist eine Baugruppe mit der Version „0.0.0.0“ Rückkehr ist, weil ASP.NET Ihre Site.Master kompiliert Datei in eine temporäre Assembly unter Ihrem Ordner "ASP.NET Temporary Files". this ist ein Verweis auf die Klasse "generated".

Assembly.GetExecutingAssembly() ist grundsätzlich die gleiche wie Assembly.GetAssembly(this.GetType()) (außer es funktioniert auch, wenn es keine „this“ (zB in statischen Methoden).

Der beste Weg, die Verwendung explicity eine Art nutzen würde, dass Sie Know besteht in der Montage sind Sie nach Als Beispiel nehme ich an Ihre „Site.Master“ eine Code-Behind-Datei hat, die in die Assembly kompiliert wird Sie, dass stattdessen verwenden können..

Assembly.GetAssembly(typeof(Site)).GetName().Version.ToString() 

(unter der Annahme, Der Name der Klasse lautet Site)

+10

Das funktioniert! '<% = Assembly.GetAssembly (typeof (HomeController)). GetName(). Version.ToString()%>' – Jaxidian

+0

Interessant, ich habe einen kleinen Test durchgeführt, indem ich eine HtmlHelper-Erweiterung mit dem Assembly.GetExecutingAssembly() -Aufruf erstellt habe und ich konnte das von meiner Site aus nennen. Master und es funktionierte gut! Das ist wirklich überraschend für mich, weil ich meine csproj-Datei so geändert habe, dass sie meine Ansichten kompiliert. Missverstehe ich, was diese Einstellung bewirkt? Ich dachte, dass alle temporären Baugruppen entfernt wurden und was nicht? – Jaxidian

+1

Ansichten werden immer kompiliert, der Unterschied besteht darin, dass Sie entweder alles auf einmal kompilieren können oder Sie sie auf Anforderung kompilieren können, wenn die Site zum ersten Mal aufgerufen wird. Wie auch immer, sie werden immer noch in eine separate DLL kompiliert. –

15

einfach als eine andere Lösung, die Menschen interessiert sein könnten, ich diese Helfer zusammengebraut haben mit diesem Problem helfen:

public static class HtmlHelperExtensions 
{ 
    private static string _CachedCurrentVersionDate; 

    /// <summary> 
    /// Return the Current Version from the AssemblyInfo.cs file. 
    /// </summary> 
    public static string CurrentVersion(this HtmlHelper helper) 
    { 
     try 
     { 
      var version = Assembly.GetExecutingAssembly().GetName().Version; 
      return version.ToString(); 
     } 
     catch 
     { 
      return "?.?.?.?"; 
     } 
    } 

    public static string CurrentVersionDate(this HtmlHelper helper) 
    { 
     try 
     { 
      if (_CachedCurrentVersionDate == null) 
      { 
       // Ignores concurrency issues - assuming not locking this is faster than 
       // locking it, and we don't care if it's set twice to the same value. 
       var version = Assembly.GetExecutingAssembly().GetName().Version; 
       var ticksForDays = TimeSpan.TicksPerDay * version.Build; // days since 1 January 2000 
       var ticksForSeconds = TimeSpan.TicksPerSecond * 2 * version.Revision; // seconds since midnight, (multiply by 2 to get original) 
       _CachedCurrentVersionDate = new DateTime(2000, 1, 1).Add(new TimeSpan(ticksForDays + ticksForSeconds)).ToString(); 
      } 

      return _CachedCurrentVersionDate; 
     } 
     catch 
     { 
      return "Unknown Version Date"; 
     } 
    } 
} 

Dies ermöglicht Verbrauch in der Fußzeile folgt:

Version: <%= Html.CurrentVersion() %> from <%= Html.CurrentVersionDate() %> 
+1

Anpassungen aufgrund von Sommerzeit werden in der Zeitberechnung nicht berücksichtigt. –

3

Wenn Sie Global.asax bereits installiert haben, könnte dies ein guter Ort sein, um die Version einmal global zu speichern.

Global.asax.cs:

public class Global : HttpApplication 
{ 
    public static readonly Version Version = Assembly.GetExecutingAssembly().GetName().Version; 
} 

Ihre Ansicht:

<div>- Version: @YourNamespace.Global.Version</div> 
+0

Leider ist dies nicht testbar. – abatishchev

8

Sie können:

beispiels in Ihrem Application_Start Verfahren in Global.asax Datei hinzufügen

protected void Application_Start(object sender, EventArgs e) 
{ 
    HttpContext.Current.Application.Add("Version", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); 
} 

in HTML zeigt es durch

<div><% =HttpContext.Current.Application["Version"].ToString() %></div> 

AUCH ändern Assembly Version 1.0.0 * von zu gehen -. Projekteigenschaften> Anwendung> Montagehinweise und Montageversion gezeigt als 1.0.0.0 - es 1.0.0 ändern *

dies wird Ihnen einige Versionierung

+0

Dies wird jedoch durch Hinzufügen verschiedener Tricks/Komplexität testbar. – abatishchev