2012-04-17 16 views
8

¿Hay algún lugar para obtener la ID de CLR en tiempo de ejecución para la aplicación actual? Estoy siguiendo mi sistema usando monitores de rendimiento y el nombre utilizado para la instancia es:Obtención de la ID CLR

ApplicationName.exe_p4952_r15_ad1 

puedo conseguir todos los demás parámetros de programación, pero no el r15 que es el ID de ejecución del tiempo de ejecución de lenguaje común (ejemplo) que se ejecuta tu codigo. Noté que siempre es 15, pero lo mejor es hacerlo dinámicamente para evitar complicaciones.

+0

¿El uso de Process.GetProcesses te ayuda? http://msdn.microsoft.com/en-us/library/system.diagnostics.process.getprocesses.aspx –

+0

Parece que no tiene lo que estoy buscando. – TheGateKeeper

+0

Eso es novedoso. ¿Qué significa "p4952" y "ad1" entonces? ¿Es este tu contador? Luego publique el código que usó para crearlo. –

Respuesta

3

Puede obtener el "sufijo" completo, es decir, la parte posterior a Application.exe utilizando la misma infraestructura que el .NET framework (por ejemplo, los contadores de rendimiento).

Existe el método System.Runtime.Versioning.VersioningHelper.MakeVersionSafeName, que puede hacer eso. Tenga en cuenta que el método se describe como "Infraestructura" y "Esta API admite la infraestructura de .NET Framework y no está destinada a ser utilizada directamente desde su código", pero de todos modos es pública. No creo que haya una forma "mejor respaldada" de obtener la información que desea. Al menos es más robusto y resistente a los cambios futuros, luego revierte la información basada en la documentación.

string suffix = System.Runtime.Versioning.VersioningHelper.MakeVersionSafeName("",       
    System.Runtime.Versioning.ResourceScope.Machine, 
    System.Runtime.Versioning.ResourceScope.AppDomain)); 

Esto devuelve _p4472_r16_ad1, por ejemplo.

Por supuesto, también puede pasar directamente el nombre del contador de rendimiento para obtener directamente el nombre completo. El uso de la cadena vacía anterior es solo un truco para obtener el "sufijo".

string str = VersioningHelper.MakeVersionSafeName("Application.exe", 
    ResourceScope.Machine, ResourceScope.AppDomain); 

// str -> "Application.exe_p4472_r16_ad1". 

VersioningHelpers La clase también tiene el método privado GetRuntimeId(), pero teniendo en cuenta lo anterior, no creo que es necesario recurrir a utilizar la reflexión sobre esa conseguir lo que necesita.

+0

Muchas gracias hombre! Sabía que había una forma de obtener esta información. Este método es perfecto. Dejé mi antiguo constructor "pieza por pieza" y usé este en su lugar, que devuelve la cadena completa por sí mismo. Además, dado que esto es lo que usa el contador de rendimiento, puedo estar seguro de que funcionará en el 99% de las máquinas en las que se ejecuta :) – TheGateKeeper

0

Se puede encontrar fácilmente mediante la división de la cadena que se obtiene:

Esta función divide el nombre de instancia, y la búsqueda de la única parte que comienza con "r" y no termina con ".exe". Una vez que se ha encontrado la parte correcta de la cadena, simplemente borre la primera letra "r" y simplemente guarde el número para convertirlo en un número entero y devolverlo. Si no se encuentra la ID de CLR, simplemente devuelva "-1" para que la función principal lo advierta.

int getClrID(string instance_name) 
    { 
     string[] instance_name_parts = instance_name.Split('_'); 
     string clr_id = ""; 

     for (int i = 0; i < instance_name_parts.Length; i++) 
     { 
      if (instance_name_parts[i].StartsWith("r") && !instance_name_parts[i].EndsWith(".exe")) 
      { 
       clr_id = instance_name_parts[i]; 
       break; 
      } 
     } 

     if (clr_id == "") // An error occured ... 
      return -1; 
     else 
      return Convert.ToInt32(clr_id.Substring(1)); 
    } 

Espero te haya ayudado.

+0

Hola, gracias por el esfuerzo, pero esto es inútil. Si de alguna manera tuviera la cadena completa en mi código, no necesitaría dividirla para obtener el ID de CLR, solo lo usaría tal como está. Necesito una forma de obtener la ID de CLR del código. – TheGateKeeper

1

Por lo que yo puedo ver, no hay forma de predecir cuál será ese valor - aquí es una cita de la (el énfasis es mío) MSDN page you linked

runtimeID es un identificador de tiempo de ejecución de lenguaje común.

El artículo es un poco confuso, ya que da un ejemplo que una aplicación myapp.exe hosts dos CLR motores de ejecución sin embargo en el ejemplo de los dos casos parecen tener diferentes identificadores de proceso, pero el mismo ID de CLR tiempo de ejecución.

Sin embargo, el artículo definitivamente no da ninguna promesa sobre cuál será el valor del ID de tiempo de ejecución de CLR o cómo encontrarlo (ni siquiera indica que es un número), lo que implica para mí que es un cosa interna y no deberías confiar en poder averiguar qué es.

Mi enfoque probablemente sería enumerar a través de todos los contadores de Perfmon y controlar cualquiera de ellos que coincidan con su PID. Si hay más de uno (lo que sucederá si está utilizando cualquier componente .Net 2.0), entonces simplemente tendrá que monitorear ambos.

¿Puede darnos más información sobre lo que está tratando de hacer?

+0

Estoy monitoreando la entrada/salida de mi aplicación. ¿Por qué Microsoft incluyó esta variable "desconocida" en la ecuación? Antes solo era appname [appID] y era tan simple de usar ... ahora es realmente confuso. Sé que puedo enumerar todas las instancias y encontrar el nombre de mi aplicación, pero preferiría no hacerlo. Seguiré buscando una solución. – TheGateKeeper

+0

@TheGateKeeper ¿En eso no puedes simplemente monitorear ambos y sumar el valor? – Justin

+0

Sé que puedo aislar el nombre de la instancia de todas las instancias que se ejecutan en perfmon, pero esa no es la solución ideal para mí. Debe haber alguna forma de obtener esta variable, es imposible que esté oculta si la incluyeron en un identificador. – TheGateKeeper