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.¿Cómo obtengo la versión de un ensamblaje sin cargarlo?
Respuesta
Encontré el siguiente in this article.
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);
mierda. Como siempre para mí, esto no funciona en el Marco Compacto. AssemblyName está allí, pero AssemblyName.GetAssemblyName no lo está. – MusiGenesis
Un viejo truco que solía usar (para escanear a través de ensamblajes de complementos) era crear un AppDomain de zona de pruebas, cargarlos en eso y luego cerrar el AppDomain cuando había terminado. No estoy seguro acerca de CF, sin embargo. –
¿Tiene un ejemplo de código para el enfoque de recinto de seguridad? – MusiGenesis
Usa AssemblyName.GetAssemblyName("assembly.dll");
, luego analiza el nombre. De acuerdo con MSDN:
esto sólo funcionará si el archivo contiene un manifiesto de ensamblado. Este método hace que el archivo se abra y se cierre, pero el conjunto no es agregado a este dominio.
Estoy tratando de no pensar en todos los hacks que he implementado tratando de obtener un número de versión sin cargar el archivo. Yeesh. – MusiGenesis
función 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 que coincide con el atributo [AssemblyVersion]
.
Creo que antes vería las opciones de AssemblyName sugeridas por otros.
La comparación de FileVersionInfo así podría ser útil también. Una actualización de una biblioteca que corrige errores pero no cambia la API podría tener la misma versión de ensamblado pero debería tener una versión de archivo diferente. Entonces, en muchos casos, AssemblyFileVersion puede ser el que desee verificar. –
Consejo: el uso de FileVersionInfo vive en el espacio de nombres de System.Diagnostics que necesitaría importar. –
@eithe, aunque para ser justos, puede presionar ctrl +. (con el foco en un tipo no resuelto) y el IDE lo encontrará y lo agregará para usted ...entonces no necesitas memorizar espacios de nombres –
Solo para el registro: Así es cómo 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);
- 1. Cargar ensamblaje en AppDomain nuevo sin cargarlo en Parent AppDomain
- 2. Insertar en la colección JPA sin cargarlo
- 3. ¿Cómo obtengo la versión de jQuery-UI?
- 4. Detalles de la versión de ensamblaje
- 5. ¿Cómo obtengo la versión de un archivo gemspec?
- 6. ¿Cómo obtengo el nombre fuerte de un ensamblaje?
- 7. Cambiar la versión de ensamblaje en un ensamblado .NET compilado
- 8. Firmando un ensamblaje sin firmar
- 9. ¿Cómo puedo obtener la versión del ensamblaje de ejecución?
- 10. ¿Cómo sincronizar la versión de publicación a la versión de ensamblaje en una aplicación .NET ClickOnce?
- 11. Deserialización binaria con diferente versión de ensamblaje
- 12. ¿Cuál es la mejor manera de usar la versión de archivo y la versión de ensamblaje?
- 13. ¿Cómo obtengo la versión de Scala dentro de Scala?
- 14. ¿Cómo elimino un objeto de un modelo de Entity Framework sin cargarlo primero?
- 15. ¿La versión del archivo de ensamblaje no cambia?
- 16. Lea la dimensión y la resolución de un archivo tiff sin cargarlo primero
- 17. git: ¿Cómo obtengo la última versión de mi código?
- 18. ¿Versión de ensamblaje desde la línea de comandos?
- 19. ¿Enlace contra versión no específica de un ensamblaje?
- 20. Cómo actualizar un registro sin cambiar la versión de fila
- 21. C#: cómo establecer el número de versión del ensamblaje
- 22. Obtener la versión de ensamblaje de otro proyecto (.exe)
- 23. ¿Cómo se genera una versión de ensamblaje en .NET?
- 24. Recuperación mediante programación de la versión de ensamblaje de un servicio en ejecución
- 25. ¿Cómo obtengo la versión publicada actual en una aplicación .NET?
- 26. ¿Cómo puedo encontrar la versión de ensamblaje del programa de llamadas?
- 27. cómo cambiar el estado de rotación del archivo de imagen sin cargarlo en la memoria
- 28. Atributo de versión de NuSpec frente a la versión de ensamblaje
- 29. ¿Cómo puedo verificar el contenido de un archivo MAT en MATLAB sin cargarlo?
- 30. cambiar el tamaño de un UIImage sin cargarlo por completo en la memoria?
¿En qué idioma estás codificando? –
@RB: el idioma no importa, porque uno usaría las mismas clases para obtener la información. –
Necesita hacer que la respuesta de Jop o Jop sea la correcta. Yo los votaría hasta un millón si pudiera. He querido saber cómo hacer esto por años. – MusiGenesis