2010-05-12 8 views
29

Estoy usando la versión de compilación automática mencionada en this question (no la respuesta seleccionada, pero la respuesta que usa la técnica [assembly: AssemblyVersion("1.0.*")]). Estoy haciendo esto en el pie de mi archivo Site.Master en MVC 2. Mi código para hacer esto es el siguiente:No se puede obtener la versión de ensamblaje para pie de página

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

La excepción que consigo es un Object reference not set to an instance of an object PORQUE GetEntryAssembly() vuelve NULL. Mis otras opciones tampoco funcionan. GetCallingAssembly() siempre devuelve "4.0.0.0" y GetExecutingAssembly() siempre devuelve "0.0.0.0". Cuando voy a ver mis archivos DLL, todo es control de versiones como era de esperar. ¡Pero no puedo encontrar la forma de acceder a él para mostrarlo en mi pie de página!

+0

'Assembly.GetAssembl. y (this.GetType()). GetName(). Version.ToString() 'también devuelve" 0.0.0.0 " – Jaxidian

+0

GetEntryAssembly() también puede devolver nulo cuando se llama al ensamblado desde el código no administrado http://msdn.microsoft .com/en-us/library/system.reflection.assembly.getentryassembly.aspx – GenEric35

+0

y w3wp.exe no está administrado, el módulo 'w3wp.exe' no contiene un encabezado CLI – GenEric35

Respuesta

56

Eso es porque Assembly.GetEntryAssembly() está volviendo nulo: no hay "entrada" de montaje en un sitio ASP.NET (porque el marco .NET está alojado en el proceso w3wp.exe). Assembly.GetEntryAssembly() se utiliza para obtener el conjunto de .exe que se puso en marcha a partir de (por lo general en una consola o una aplicación de Windows)

La razón Assembly.GetAssembly(this.GetType()) está volviendo una asamblea con la versión "0.0.0.0" se debe a que ASP.NET compila su Site.Master archivo en un ensamblaje temporal en la carpeta "Archivos temporales de ASP.NET". this es una referencia a la clase "generada".

Assembly.GetExecutingAssembly() es básicamente lo mismo que Assembly.GetAssembly(this.GetType()) (excepto que también funciona cuando no hay "este" (por ejemplo, en los métodos estáticos).

La mejor manera sería explícitamente el uso usar un tipo que conocimientos existe en la asamblea que está buscando Como ejemplo, supongo que su "Site.Master" tiene un archivo de código subyacente que se compila en la asamblea se puede utilizar en lugar de que:..

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

(suponiendo el nombre de la clase es Site)

+10

¡Esto funciona! '<% = Assembly.GetAssembly (typeof (HomeController)). GetName(). Version.ToString()%>' – Jaxidian

+0

Interesante, realicé una pequeña prueba al crear una extensión HtmlHelper que tiene la llamada Assembly.GetExecutingAssembly() en ella ¡Pude llamarlo desde mi Site.Master y funcionó perfectamente! Esto en realidad me sorprende porque modifiqué mi archivo csproj para que compile mis puntos de vista. ¿Estoy entendiendo mal lo que hace ese ajuste? Pensé que eliminaron todas las asambleas temporales y otras cosas? – Jaxidian

+1

Las vistas siempre se compilan, la diferencia es que puede compilar todo de antemano de una sola vez o puede compilarlas a pedido cuando se accede por primera vez al sitio. De cualquier manera, todavía se compilarán en una DLL separada. –

15

Así como otra solución que la gente puede estar interesado en, he inventé estos ayudantes para ayudar con este problema:

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

Esto permite el consumo de la siguiente manera en su pie de página:

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

Los ajustes debido al horario de verano no se tienen en cuenta en el cálculo del tiempo. –

3

Si ya tiene Global.asax en su lugar, podría ser un buen lugar para almacenar la versión global una vez.

Global.asax.cs:

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

su punto de vista:

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

Desafortunadamente esto no es comprobable. – abatishchev

8

Puede:

por ejemplo, en el método de Application_Start en Global.archivo asax añadir

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

en HTML lo manifiesto en

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

también la versión de cambio del ensamble a 1.0.0 * yendo a -. Propiedades del proyecto> Aplicación> Información de ensamblado y montaje es la versión se muestra como 1.0.0.0 - cambiarlo a 1.0.0 *

esto le dará algunas versiones

+0

Esto se puede probar añadiendo varios trucos/complejidad. – abatishchev

Cuestiones relacionadas