¿Cómo verificar si un progtwig está usando .NET?

¿Podemos verificar si una aplicación en ejecución o un progtwig usa .Net Framework para ejecutarse?

Hay un truco que una vez aprendí de la lista de preguntas de la entrevista de Scott Hanselman. Puede enumerar fácilmente todos los progtwigs que ejecutan .NET en el símbolo del sistema utilizando:

tasklist /m "mscor*"

mscor* todos los procesos que tengan mscor* entre sus módulos cargados.

Podemos aplicar el mismo método en el código:

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

Use las interfaces CLR COM ICorPublish e ICorPublishProcess. La forma más fácil de hacer esto desde C # es tomar prestado un código del depurador de SharpDevelop, y hacer lo siguiente:

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

Use la función System.Reflection.Assembly.LoadFrom para cargar el archivo .exe. Esta función lanzará una excepción si intenta cargar un archivo binario que no es un ensamblado de .NET.

Programáticamente obtendría el nombre de la imagen inicial utilizando Win32 API como NtQueryInformationProcess , o en .Net use System.Diagnostics.Process.GetProcesses() y leería Process.StartInfo.FileName .

A continuación, abra y decodifique los encabezados PE de esa imagen usando los detalles prescritos en el artículo de MSDN a continuación:

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

Advertencias: solo detectará ensamblados construidos .NET, por ejemplo, no detectará Win32 EXEs que hospeda dinámicamente CLR usando las API de CorHost.

Sé que esto es un millón de años demasiado tarde, pero en caso de que sea útil, mi método favorito para averiguar si un exe está usando .net es ejecutar el desensamblador MSIL contra él que viene con .net SDK. Si tiene un .NET exe, obtendrá un buen desglose gráfico de su contenido; si es un simple y viejo win32 exe, recibirás un mensaje indicándote lo mismo.

Sugiero descargar el DotNetReflector de Redgate y verificar si puede abrir la aplicación.

Una lista de ejecución de procesos .NET está disponible en el Performance Monitor . Simplemente ejecute perfmon y en las Herramientas de supervisión >> Monitor de rendimiento haga clic en el ícono + o presione Ctrl + N. En la lista de contadores disponibles, al principio de la lista encuentre .NET CLR Jit y seleccione un sub artículo. Verá una lista del proceso .NET en Instancias de la lista de objetos seleccionados .

Si desea un método en C # sin ejecutar su aplicación en modo Administrador, hay una solución introducida por la herramienta Process Hacker .

De acuerdo con Process Hacker / .NET Tools / native.c :

La mayoría de los procesos .NET tienen un manejador abierto a una sección llamada \ BaseNamedObjects \ Cor_Private_IPCBlock ( v4) . Este es el mismo objeto utilizado por la función ICorPublish :: GetProcess. En lugar de llamar a esa función, simplemente verificamos la existencia de ese objeto de sección. Esto significa: * Mejor rendimiento. * No es necesario tener derechos de administrador para obtener el estado .NET de procesos propiedad de otros usuarios.

Obtener una lista de identificadores de proceso en C # es un poco difícil . En su lugar, puede descargar DotNetTools.dll de la carpeta de plugins de Process Hacker y crear un método extern para utilizar la función PhGetProcessIsDotNet .