¿Cómo puedo obtener la versión de ensamblaje en ejecución?

169

Estoy tratando de obtener la versión de ensamblaje en ejecución en C # 3.0 usando el siguiente código:

var assemblyFullName = Assembly.GetExecutingAssembly().FullName;
var version = assemblyFullName .Split(',')[1].Split('=')[1];

¿Hay otra forma adecuada de hacerlo?

usuario1
fuente

Respuestas:

293

Dos opciones ... independientemente del tipo de aplicación, siempre puede invocar:

Assembly.GetExecutingAssembly().GetName().Version

Si es una aplicación de Windows Forms , siempre puede acceder a través de la aplicación si busca específicamente la versión del producto.

Application.ProductVersion

Usar GetExecutingAssemblypara una referencia de ensamblaje no siempre es una opción. Como tal, personalmente me parece útil crear una clase auxiliar estática en proyectos en los que pueda necesitar hacer referencia al ensamblaje subyacente o la versión del ensamblaje:

// A sample assembly reference class that would exist in the `Core` project.
public static class CoreAssembly
{
    public static readonly Assembly Reference = typeof(CoreAssembly).Assembly;
    public static readonly Version Version = Reference.GetName().Version;
}

Entonces puedo hacer referencia limpia CoreAssembly.Versionen mi código según sea necesario.

Chris Baxter
fuente
77
Si se implementa con ClickOnce, debe verificarloSystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion
Justin Morgan
Lo que sería interesante: ¿Dónde necesita especificar la versión real? Especifiqué AssemblyVersion y AssemblyFileVersion en mi AssemblyInfo.cs y todo lo que obtengo de la llamada al método anterior es: 0.0.0.0 a pesar de haber especificado 1.0.0
AgentKnopf
@Zainodis Si se refiere a la ClickOnceversión mencionada por @Justin, se especifica en la Publishpestaña dentro de las propiedades del proyecto (es decir, no está relacionada con AssemblyVersion o AssemblyFileVersion).
Chris Baxter
@CalgaryCoder gracias por la respuesta, no sé qué es ClickOnce, pero resultó que al editar el archivo AssemblyInfo a través de VS, de repente funcionó oO. Al editar AssemblyInfo.cas manualmente en un editor de texto, todos los campos aparecen vacíos. De cualquier manera, está resuelto ahora :)
AgentKnopf
77
Vale la pena mencionar que esto no funciona en las aplicaciones ASP.NET MVC, debido al contexto de lanzamiento. Una solución alternativa es hacer referencia a un Tipo conocido en el ensamblaje de su sitio web, por ejemplo, el MVC omnipresente HomeController, por lo que en Razor:v@(Assembly.GetAssembly(typeof(MyWebProject.Mvc.Controllers.HomeController)).GetName().Version.ToString(2))
James McCormack
38

En MSDN, Assembly.GetExecutingAssembly Method , es un comentario sobre el método "getexecutingassembly", que por razones de rendimiento, debe llamar a este método solo cuando no sabe en el momento del diseño qué ensamblaje se está ejecutando actualmente.

La forma recomendada de recuperar un objeto de ensamblaje que representa el ensamblaje actual es usar la Type.Assemblypropiedad de un tipo encontrado en el ensamblaje.

El siguiente ejemplo ilustra:

using System;
using System.Reflection;

public class Example
{
    public static void Main()
    {
        Console.WriteLine("The version of the currently executing assembly is: {0}",
                          typeof(Example).Assembly.GetName().Version);
    }
}

/* This example produces output similar to the following:
   The version of the currently executing assembly is: 1.1.0.0

Por supuesto, esto es muy similar a la respuesta con la clase auxiliar "clase estática pública CoreAssembly", pero, si conoce al menos un tipo de ensamblaje en ejecución, no es obligatorio crear una clase auxiliar y le ahorra tiempo.

Sharunas Bielskis
fuente
19
using System.Reflection;
{
    string version = Assembly.GetEntryAssembly().GetName().Version.ToString();
}

Observaciones de MSDN http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly%28v=vs.110%29.aspx :

El GetEntryAssemblymétodo puede volver nullcuando se ha cargado un ensamblado administrado desde una aplicación no administrada. Por ejemplo, si una aplicación no administrada crea una instancia de un componente COM escrito en C #, se GetEntryAssemblydevuelve una llamada al método desde el componente C # null, porque el punto de entrada para el proceso era un código no administrado en lugar de un ensamblado administrado.

Hammad Qureshi
fuente
2
+1. GetEntryAssembly(vs GetCallingAssemblyor GetExecutingAssembly) parece ser lo único que funciona cuando se llama desde una biblioteca de referencia.
drzaus
6

Esto debería hacer:

Assembly assem = Assembly.GetExecutingAssembly();
AssemblyName aName = assem.GetName();
return aName.Version.ToString();
Elroy Flynn
fuente
55
estas 3 líneas podrían convertirse en 1: return Assembly.GetExecutingAssembly (). GetName (). Version.ToString (); .............
Alexandre
1

Product Version puede preferirse si está utilizando el control de versiones a través de GitVersion u otro software de control de versiones.

Para obtener esto desde la biblioteca de su clase, puede llamar a System.Diagnostics.FileVersionInfo.ProductVersion:

using System.Diagnostics;
using System.Reflection;

//...

var assemblyLocation = Assembly.GetExecutingAssembly().Location;
var productVersion = FileVersionInfo.GetVersionInfo(assemblyLocation).ProductVersion

ingrese la descripción de la imagen aquí

Daniel
fuente