Come verificare se un programma sta usando .NET?

Possiamo verificare se un’applicazione o un programma in esecuzione utilizza il framework .Net per eseguirsi da solo?

C’è un trucco che ho imparato una volta dall’elenco di domande di intervista di Scott Hanselman. Puoi facilmente elencare tutti i programmi che eseguono .NET nel prompt dei comandi usando:

tasklist /m "mscor*"

mscor* tutti i processi che hanno mscor* tra i loro moduli caricati.

Possiamo applicare lo stesso metodo nel codice:

 public static bool IsDotNetProcess(this Process process) { var modules = process.Modules.Cast().Where( m => m.ModuleName.StartsWith("mscor", StringComparison.InvariantCultureIgnoreCase)); return modules.Any(); } 

Utilizzare le interfacce COM CLR ICorPublish e ICorPublishProcess. Il modo più semplice per farlo da C # è prendere in prestito del codice dal debugger di SharpDevelop e fare quanto segue:

 ICorPublish publish = new ICorPublish(); ICorPublishProcess process; process = publish.GetProcess(PidToCheck); if (process == null || !process.IsManaged) { // Not managed. } else { // Managed. } 

Usa System.Reflection.Assembly.LoadFrom per caricare il file .exe. Questa funzione genera un’eccezione se si tenta di caricare un file binario che non è un assembly .NET.

A livello di programmazione si otterrà il nome dell’immagine iniziale utilizzando l’API Win32 come NtQueryInformationProcess , o in. NtQueryInformationProcess use System.Diagnostics.Process.GetProcesses() e leggere Process.StartInfo.FileName .

Quindi aprire e decodificare le intestazioni PE di quell’immagine utilizzando i dettagli indicati nell’articolo MSDN riportato di seguito:

http://msdn.microsoft.com/en-us/magazine/cc301808.aspx

Avvertenze: rileverà solo gli assembly .NET costruiti, ad esempio non rileverà gli EXE Win32 che ospitano dynamicmente CLR utilizzando le API CorHost.

So che questo è di circa un milione di anni troppo tardi, ma nel caso in cui aiuta – il mio metodo preferito per capire se un exe sta usando .net è quello di eseguire MSIL disassembler contro di esso che viene fornito con. NET SDK. Se un file .net exe hai effettivamente, otterrai una buona analisi grafica dei suoi contenuti; se un vecchio ex32 win32 lo è, riceverai un messaggio che ti dice così.

Suggerisco di scaricare il DotNetReflector di Redgate e controllare se può aprire l’applicazione.

Un elenco di processi .NET in esecuzione è disponibile in Performance Monitor . Basta eseguire perfmon e in Strumenti di monitoraggio >> Performance Monitor fare clic su + Icon o premere Ctrl + N. Nell’elenco dei contatori disponibili, all’inizio dell’elenco trovare .NET CLR Jit e selezionare un elemento secondario. Verrà visualizzato un elenco di processi .NET in Istanze dell’elenco di oggetti selezionati .

Se si desidera un metodo in C # senza eseguire l’app in modalità Amministratore, esiste una soluzione introdotta dallo strumento Process Hacker .

Secondo Process Hacker / .NET Tools / native.c :

La maggior parte dei processi .NET ha un handle aperto a una sezione denominata \ BaseNamedObjects \ Cor_Private_IPCBlock ( v4) . Questo è lo stesso object utilizzato dalla funzione ICorPublish :: GetProcess. Invece di chiamare quella funzione, controlliamo semplicemente l’esistenza di quell’object di sezione. Questo significa: * Migliori prestazioni. * Non c’è bisogno di diritti di amministrazione per ottenere lo stato .NET dei processi di proprietà di altri utenti.

Ottenere un elenco di handle di processo in C # è un po ‘di duro lavoro . Invece è ansible scaricare DotNetTools.dll dalla cartella dei plugins Process Hacker e creare un metodo extern per utilizzare la funzione PhGetProcessIsDotNet .