2010-04-06 12 views
6

Desidero registrare le versioni di tutte le DLL utilizzate dall'applicazione .NET. Non importa se l'output del log viene generato all'avvio o al primo utilizzo di ogni DLL.Versioni di registro di tutte le DLL utilizzate

La prima soluzione che mi è venuta in mente era quella di eseguire l'iterazione su tutti i file DLL che risiedono nella stessa directory dell'assembly. Ma questa è l'opzione migliore che ho? C'è un modo migliore per farlo? È importante che la soluzione funzioni anche su .NET-Compact-Framework.

+1

In base alla risposta a questa domanda, sembra non esistere una soluzione semplice, http://stackoverflow.com/questions/940885 –

risposta

6

Modifica: Ho testato e verificato che funzioni su .NET Compact Framework.

È possibile eseguire questa operazione utilizzando Mono.Cecil, un potente strumento che consente di aprire e ispezionare gli assembly .NET a livello IL senza nemmeno caricarli in un AppDomain.

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

Com'è possibile che sia anche remotamente utile per il framework COmpact? – ctacke

+1

@ctacke: Mono.Cecil non è una libreria specifica per Mono; lo distribuisci con la tua applicazione. Ho verificato che funziona davvero sul CF. –

+0

allora questo è semplicemente fighissimo! – ctacke

0

Non sono sicuro che sia disponibile su CF, ma in .NET normale, vorrei semplicemente usare AppDomain.GetAssemblies().

È possibile utilizzare l'evento AppDomain.AssemblyLoad per informare l'utente quando viene caricato un assieme.

+1

Sfortunatamente sia il metodo che l'evento non sono disponibili su CF. – Bob

0

Potrebbe essere possibile utilizzare lo Dependency Walker e utilizzare semplicemente le opzioni della riga di comando per eseguirlo come sottoprocesso. Secondo le FAQ, funziona contro i moduli Windows CE, anche se non funziona su dispositivi CE, quindi potrebbe non soddisfare le tue esigenze.

0

Utilizzare l'evento AppDomain.AssemblyLoad.

ad es.

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

Sfortunatamente l'evento AssemblyLoad non è disponibile su 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, sembra AppDomain.GetAssemblies() non è in struttura compatta.

0

immagino un algoritmo interessante sarebbe quello di serializzare le assemblee che si sta utilizzando, quindi, all'avvio, si deserializzare la configurazione e la confronta con quale versione avete di ogni DLL. Quindi, al momento dell'aggiornamento della versione, serializzi una nuova versione della configurazione e registra il nome e la versione dell'assembly nel tuo file di registro.

Ricorda che la cosa più importante da considerare è far sì che la cosa faccia ciò che ti serve. Non importa nient'altro. Una volta che fa il lavoro che richiede, c'è forse margini di miglioramento. Ma prima, fallo funzionare! Vedrai semplicemente cosa deve essere migliorato in seguito.

Problemi correlati