Obtenga programáticamente el número de versión de una DLL

¿Es posible obtener el número de versión mediante progtwigción desde cualquier DLL .NET?

Si es así, ¿cómo?

Assembly assembly = Assembly.LoadFrom("MyAssembly.dll"); Version ver = assembly.GetName().Version; 

Importante: debe tenerse en cuenta que esta no es la mejor respuesta a la pregunta original. No olvides leer más en esta página.

Esto funciona si el dll es .net o Win32 . Los métodos de reflexión solo funcionan si el dll es .net. Además, si usa el reflection, tiene la carga de cargar todo el dll en la memoria. El siguiente método no carga el ensamblaje en la memoria.

 // Get the file version for the notepad. FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(@"C:\MyAssembly.dll"); // Print the file name and version number. Console.WriteLine("File: " + myFileVersionInfo.FileDescription + '\n' + "Version number: " + myFileVersionInfo.FileVersion); 

De: http://msdn.microsoft.com/en-us/library/system.diagnostics.fileversioninfo.fileversion.aspx

fuente original

En primer lugar, hay dos posibles ‘versiones’ que podrían interesarle:

  • Versión del archivo del sistema de archivos de Windows, aplicable a todos los archivos ejecutables

  • Versión de comstackción de ensamblaje, que está incrustado en un ensamblado .NET por el comstackdor (obviamente, solo es aplicable a los archivos dll y exe de ensamblado .NET)

En el primer caso, debes usar la respuesta de Ben Anderson; en este último caso, utilice AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Version , o la respuesta de Tataro, en caso de que su código haga referencia al ensamblado.

Tenga en cuenta que puede ignorar todas las respuestas que utilizan los .Load() / .LoadFrom() , ya que estos realmente cargan el ensamblado en el Dominio de aplicación actual, que es análogo a cortar un árbol para ver cuántos años tiene.

Para obtenerlo para el ensamblado que se inició (winform, aplicación de consola, etc.)

 using System.Reflection; ... Assembly.GetEntryAssembly().GetName().Version 

Esta es una buena manera usando un poco de reflexión para obtener una versión de un archivo DLL que contenga una clase en particular:

 var ver = System.Reflection.Assembly.GetAssembly(typeof(!Class!)).GetName().Version; 

¡Solo reemplaza! ¡Clase! con el nombre de una clase que se define en la DLL de la que desea obtener la versión.

Este es mi método preferido porque si muevo las DLL para diferentes implementaciones, no tengo que cambiar la ruta de archivo.

Kris, tu versión funciona muy bien cuando necesitas cargar el ensamblado desde el archivo DLL real (¡y si el DLL está ahí!), Sin embargo, uno obtendrá un error mucho menos deseado si el DLL está EMBEDDED (es decir, no es un archivo sino un archivo incrustado) DLL).

La otra cosa es que si uno usa un esquema de control de versiones con algo así como ” 1.2012.0508.0101 “, cuando uno obtiene la cadena de versión obtendrá ” 1.2012.518.101 “; nota los ceros perdidos .

Por lo tanto, aquí hay algunas funciones adicionales para obtener la versión de un archivo DLL (incrustado o desde el archivo DLL):

  public static System.Reflection.Assembly GetAssembly(string pAssemblyName) { System.Reflection.Assembly tMyAssembly = null; if (string.IsNullOrEmpty(pAssemblyName)) { return tMyAssembly; } tMyAssembly = GetAssemblyEmbedded(pAssemblyName); if (tMyAssembly == null) { GetAssemblyDLL(pAssemblyName); } return tMyAssembly; }//System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName) public static System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName) { System.Reflection.Assembly tMyAssembly = null; if(string.IsNullOrEmpty(pAssemblyDisplayName)) { return tMyAssembly; } try //try #a { tMyAssembly = System.Reflection.Assembly.Load(pAssemblyDisplayName); }// try #a catch (Exception ex) { string m = ex.Message; }// try #a return tMyAssembly; }//System.Reflection.Assembly GetAssemblyEmbedded(string pAssemblyDisplayName) public static System.Reflection.Assembly GetAssemblyDLL(string pAssemblyNameDLL) { System.Reflection.Assembly tMyAssembly = null; if (string.IsNullOrEmpty(pAssemblyNameDLL)) { return tMyAssembly; } try //try #a { if (!pAssemblyNameDLL.ToLower().EndsWith(".dll")) { pAssemblyNameDLL += ".dll"; } tMyAssembly = System.Reflection.Assembly.LoadFrom(pAssemblyNameDLL); }// try #a catch (Exception ex) { string m = ex.Message; }// try #a return tMyAssembly; }//System.Reflection.Assembly GetAssemblyFile(string pAssemblyNameDLL) public static string GetVersionStringFromAssembly(string pAssemblyDisplayName) { string tVersion = "Unknown"; System.Reflection.Assembly tMyAssembly = null; tMyAssembly = GetAssembly(pAssemblyDisplayName); if (tMyAssembly == null) { return tVersion; } tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString()); return tVersion; }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName) public static string GetVersionString(Version pVersion) { string tVersion = "Unknown"; if (pVersion == null) { return tVersion; } tVersion = GetVersionString(pVersion.ToString()); return tVersion; }//string GetVersionString(Version pVersion) public static string GetVersionString(string pVersionString) { string tVersion = "Unknown"; string[] aVersion; if (string.IsNullOrEmpty(pVersionString)) { return tVersion; } aVersion = pVersionString.Split('.'); if (aVersion.Length > 0) { tVersion = aVersion[0]; } if (aVersion.Length > 1) { tVersion += "." + aVersion[1]; } if (aVersion.Length > 2) { tVersion += "." + aVersion[2].PadLeft(4, '0'); } if (aVersion.Length > 3) { tVersion += "." + aVersion[3].PadLeft(4, '0'); } return tVersion; }//string GetVersionString(Version pVersion) public static string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName) { string tVersion = "Unknown"; System.Reflection.Assembly tMyAssembly = null; tMyAssembly = GetAssemblyEmbedded(pAssemblyDisplayName); if (tMyAssembly == null) { return tVersion; } tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString()); return tVersion; }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName) public static string GetVersionStringFromAssemblyDLL(string pAssemblyDisplayName) { string tVersion = "Unknown"; System.Reflection.Assembly tMyAssembly = null; tMyAssembly = GetAssemblyDLL(pAssemblyDisplayName); if (tMyAssembly == null) { return tVersion; } tVersion = GetVersionString(tMyAssembly.GetName().Version.ToString()); return tVersion; }//string GetVersionStringFromAssemblyEmbedded(string pAssemblyDisplayName) 
 var versionAttrib = new AssemblyName(Assembly.GetExecutingAssembly().FullName); 

Puede utilizar los métodos System.Reflection.Assembly.Load * () y luego tomar su AssemblyInfo.

Si bien la pregunta original puede no ser específica de un servicio web, aquí hay un testWebService completo que puede agregar para mostrar una respuesta del servicio web no almacenada en caché más la versión del archivo. Usamos la versión de archivo en lugar de la versión de ensamblaje porque queremos conocer una versión, pero con todas las versiones de ensamblaje 1.0.0.0, el sitio web puede parchearse fácilmente (¡el enlace de firma y demanda sigue activo!). Reemplace @ Class @ con el nombre del controlador de API web en el que está incrustado este servicio. Es bueno para go / nogo en un servicio web más una versión rápida de verificación.

  [Route("api/testWebService")] [AllowAnonymous] [HttpGet] public HttpResponseMessage TestWebService() { HttpResponseMessage responseMessage = Request.CreateResponse(HttpStatusCode.OK); string loc = Assembly.GetAssembly(typeof(@Class@)).Location; FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(loc); responseMessage.Content = new StringContent($"

The XXXXX web service GET test succeeded.

{DateTime.Now}

File Version: {versionInfo.FileVersion}"); responseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html"); Request.RegisterForDispose(responseMessage); return responseMessage; }

También me pareció necesario agregar lo siguiente a web.config en la configuración para que sea verdaderamente anónimo