.net - puede - ¿Cómo obtengo la versión de un ensamblaje sin cargarlo?
no se puede cargar el archivo o ensamblado system io filesystem (4)
Una función pequeña de un programa grande examina los ensamblajes en una carpeta y reemplaza los ensamblajes desactualizados con las versiones más recientes. Para lograr esto, necesita leer los números de versión de los archivos de ensamblaje existentes sin cargarlos en el proceso de ejecución.
Dependiendo de los archivos, una opción podría ser FileVersionInfo
- es decir
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(path)
string ver = fvi.FileVersion;
El problema es que esto depende del código que tiene el atributo [AssemblyFileVersion]
y coincide con el atributo [AssemblyVersion]
.
Sin embargo, creo que primero miraría las opciones de AssemblyName sugeridas por otros.
Encontré lo siguiente en este artículo .
using System.Reflection;
using System.IO;
...
// Get current and updated assemblies
AssemblyName currentAssemblyName = AssemblyName.GetAssemblyName(currentAssemblyPath);
AssemblyName updatedAssemblyName = AssemblyName.GetAssemblyName(updatedAssemblyPath);
// Compare both versions
if (updatedAssemblyName.Version.CompareTo(currentAssemblyName.Version) <= 0)
{
// There''s nothing to update
return;
}
// Update older version
File.Copy(updatedAssemblyPath, currentAssemblyPath, true);
Use AssemblyName.GetAssemblyName("assembly.dll");
, luego analizar el nombre. De acuerdo con MSDN :
Esto solo funcionará si el archivo contiene un manifiesto de ensamblaje. Este método hace que el archivo se abra y se cierre, pero el ensamblaje no se agrega a este dominio.
Solo para que conste: esta es la forma de obtener la versión del archivo en C # .NET Compact Framework. Básicamente es de OpenNETCF, pero bastante más corto y está desactivado, por lo que puede copiarse. Espero que ayude ...
public static Version GetFileVersionCe(string fileName)
{
int handle = 0;
int length = GetFileVersionInfoSize(fileName, ref handle);
Version v = null;
if (length > 0)
{
IntPtr buffer = System.Runtime.InteropServices.Marshal.AllocHGlobal(length);
if (GetFileVersionInfo(fileName, handle, length, buffer))
{
IntPtr fixedbuffer = IntPtr.Zero;
int fixedlen = 0;
if (VerQueryValue(buffer, "//", ref fixedbuffer, ref fixedlen))
{
byte[] fixedversioninfo = new byte[fixedlen];
System.Runtime.InteropServices.Marshal.Copy(fixedbuffer, fixedversioninfo, 0, fixedlen);
v = new Version(
BitConverter.ToInt16(fixedversioninfo, 10),
BitConverter.ToInt16(fixedversioninfo, 8),
BitConverter.ToInt16(fixedversioninfo, 14),
BitConverter.ToInt16(fixedversioninfo, 12));
}
}
Marshal.FreeHGlobal(buffer);
}
return v;
}
[DllImport("coredll", EntryPoint = "GetFileVersionInfo", SetLastError = true)]
private static extern bool GetFileVersionInfo(string filename, int handle, int len, IntPtr buffer);
[DllImport("coredll", EntryPoint = "GetFileVersionInfoSize", SetLastError = true)]
private static extern int GetFileVersionInfoSize(string filename, ref int handle);
[DllImport("coredll", EntryPoint = "VerQueryValue", SetLastError = true)]
private static extern bool VerQueryValue(IntPtr buffer, string subblock, ref IntPtr blockbuffer, ref int len);