2010-01-17 13 views
32

¿Podemos verificar si una aplicación en ejecución o un programa usa .Net Framework para ejecutarse?¿Cómo comprobar si un programa está utilizando .NET?

+6

Crank up Process Monitor y si el ejecutable está resaltado en amarillo, es una aplicación administrada. Hurr. – Will

+3

Will, creo que se refería a Process Explorer;) –

Respuesta

38

Hay un truco que una vez aprendí de Scott Hanselman's list of interview questions. Usted puede enumerar fácilmente todos los programas que se ejecutan en .NET símbolo del sistema mediante:

tasklist /m "mscor*"

aparecerá una lista de todos los procesos que tienen 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<ProcessModule>().Where(
     m => m.ModuleName.StartsWith("mscor", StringComparison.InvariantCultureIgnoreCase)); 

    return modules.Any(); 
} 
+3

Tenga en cuenta que esto deja fuera posibles procesos Mono. – Dykam

+0

@Dykam ¿El tiempo de ejecución de mono no es también llamado mscorlib.dll? –

+2

El tiempo de ejecución es simplemente 'mono'. O 'mono.exe' en Windows. .Net usa PE para permitir que el sistema operativo use mscorlib.dll para iniciar la aplicación, pero mono no hace tal truco. Y el verdadero core lib se llama corlib.dll, creo, ya que no es corlib de MS. – Dykam

6

Utilice 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.

+1

-1: preguntó acerca de una aplicación en ejecución –

+4

¿qué diferencia hace? ¿la aplicación en ejecución no tiene el archivo .exe? –

+0

En ese caso, muéstrele cómo encontrar el archivo EXE correspondiente al programa en ejecución; y mostrarle cómo lidiar con la posibilidad de que su proceso no tenga acceso de lectura al archivo .EXE. –

6

programación se obtendría el nombre de la imagen a partir usando API de Win32 como NtQueryInformationProcess, o en uso .Net System.Diagnostics.Process.GetProcesses() y leer Process.StartInfo.FileName.

Entonces abierta y decodificar los encabezados de PE de que la imagen utilizando los datos prescritos en el artículo de MSDN a continuación:

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

Advertencias: sólo detectará .NET construidas conjuntos por ejemplo no detectará Win32 EXEs que aloja dinámicamente CLR usando las API de CorHost.

11

Uso CLR COM interfaces de ICorPublish y ICorPublishProcess. La forma más sencilla de hacer esto desde C# es pedir prestado algo de código de depuración 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. 
} 
+0

Me preguntaba, si hace esto desde C#, ¿en qué condiciones este informe de verificación "no se administrará"? – stakx

+0

Parece que solo considerará administrar aquellos procesos que tienen el mismo CLR utilizado - https://social.msdn.microsoft.com/Forums/en-US/fac08eee-001d-4566-b1e7-fda1ddbc37e7/icorpublishgetprocess-throws- systemargumentexception-value-does-not-fall-within-the-expected? forum = netfxtoolsdev. Entonces uno debe tener cuidado con eso. –

2

sugiero bajarse DotNetReflector del Redgate y comprobar si puede abrir la aplicación.

6

Sé que esto es aproximadamente un millón de años demasiado tarde, pero en caso de que ayude, 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.

+0

Buena respuesta. Específicamente, ejecute ILDASM.EXE, que se instala automáticamente con Visual Studio. Consulte: http://msdn.microsoft.com/en-us/library/f7dy01k1(v=vs.110).aspx Para iniciar ILDASM desde Win8/VS2013: Inicio -> Herramientas de Visual Studio -> Símbolo del sistema de desarrollador para VS2013 . Desde Win8/VS2012: Inicio -> Comando de desarrollador -> Símbolo del sistema de desarrollador para VS2012. Desde Win7: Todos los programas -> Microsoft Visual Studio -> Herramientas de Visual Studio -> Símbolo del sistema de Visual Studio. –

Cuestiones relacionadas