2010-04-06 13 views
6

Quiero registrar las versiones de todas las DLL que usa mi aplicación .NET. No importa si el log-output se genera en el inicio o en el primer uso de cada DLL.Versiones de registro de todas las DLL usadas

La primera solución que vino a la mente fue para iterar sobre todos los archivos DLL que se encuentran en el mismo directorio que mi montaje. ¿Pero esta es la mejor opción que tengo? ¿Hay alguna forma mejor de hacer esto? Es importante que la solución también funcione en .NET-Compact-Framework.

+1

De acuerdo con la respuesta a esta pregunta parece que no existe una solución simple, http://stackoverflow.com/questions/940885 –

Respuesta

6

Edit: He probado y verificado que esto funciona en .NET Compact Framework.

Puede hacer esto usando Mono.Cecil, una poderosa herramienta que le permite abrir e inspeccionar ensambles .NET en el nivel IL sin siquiera cargarlos en un Dominio de aplicación.

string path = System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase; 

// If using Mono.Cecil 0.6.9.0: 
AssemblyDefinition myAssembly = AssemblyFactory.GetAssembly(path); 

// If using Mono.Cecil 0.9.1.0: 
AssemblyDefinition myAssembly = AssemblyDefinition.ReadAssembly(path); 

// from there, you can inspect the assembly's references 
foreach (ModuleDefinition module in myAssembly.Modules) 
{ 
    foreach (AssemblyNameReference assemblyReference in module.AssemblyReferences) 
    { 
     // do something with the reference e.g get name, version, etc 
     string fullName = assemblyReference.FullName; 
     Version version = assemblyReference.Version; 
    } 
} 
+0

¿Cómo es eso remotamente útil para el Marco de trabajo? – ctacke

+1

@ctacke: Mono.Cecil no es una biblioteca específica Mono; lo implementa con su aplicación. He verificado que efectivamente funciona en el CF. –

+0

¡entonces eso solo está cambiando! – ctacke

0

No estoy seguro de si está disponible en la FQ, pero en .NET normal, yo simplemente utilizar AppDomain.GetAssemblies().

Usted puede utilizar el evento AppDomain.AssemblyLoad para que le notifique cuando se carga un ensamblado.

+1

Lamentablemente, tanto el método como el evento no están disponibles en CF. – Bob

0

Es posible que pueda utilizar el Dependency Walker, y simplemente use las opciones de línea de comandos para ejecutarlo como un subproceso. De acuerdo con las preguntas más frecuentes, funciona contra los módulos de Windows CE, aunque no se ejecuta en dispositivos CE, por lo que puede no adaptarse a sus necesidades.

0

utilizar el evento AppDomain.AssemblyLoad.

p. Ej.

AppDomain.CurrentDomain.AssemblyLoad+=(s, e) => 
    Console.WriteLine("loaded: "+e.LoadedAssembly.FullName); 
+1

Desafortunadamente, AssemblyLoad-Event no está disponible en Compact Framework. – Bob

0
public void LogAssemblies() 
{ 
    foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) 
    { 
    AssemblyName assemblyName = asm.GetName(); 
    string simpleName = assemblyName.Name; 
    string version = assemblyName.Version.ToString(); 
    // do something with these 
    } 
} 

EDIT: Woops, parece AppDomain.GetAssemblies() no está en el marco compacto.

0

supongo un algoritmo sería interesante para serializar los montajes que se está usando, entonces, en el inicio, deserializar la configuración y comparar con la versión que tiene de cada DLL. Luego, al momento de la actualización de la versión, serializará una nueva versión de su configuración y registrará el nombre y la versión de su ensamblaje en su archivo de registro, más o menos.

Tenga en cuenta que lo más importante a tener en cuenta es hacer que la cosa haga lo que necesita hacer. Nada más importa. Una vez que hace el trabajo que necesita, tal vez haya margen de mejora. Pero primero, ¡haz que funcione! Simplemente verá lo que necesita mejorar luego.

Cuestiones relacionadas