Obtenir l’ID du CLR

Existe-t-il un ID ID CLR au moment de l’exécution pour l’application actuelle? Je surveille mon système à l’aide de Performance Monitors et le nom utilisé pour l’instance est:

ApplicationName.exe_p4952_r15_ad1 

Je peux obtenir tous les autres parameters par programme, mais pas le r15 qui est l’ID d’exécution de l’instance (Common Language Runtime) qui exécute votre code. J’ai remarqué qu’il est toujours 15, mais il est préférable de l’obtenir de manière dynamic pour éviter les complications.

Vous pouvez obtenir le “suffixe” complet, c’est-à-dire la partie après Application.exe utilisant la même infrastructure que le framework .NET (par exemple, les compteurs de performances).

Il existe la méthode System.Runtime.Versioning.VersioningHelper.MakeVersionSafeName , qui peut le faire. Notez que la méthode est décrite comme étant “Infrastructure” et “Cette API prend en charge l’infrastructure .NET Framework et n’est pas destinée à être utilisée directement à partir de votre code.”, Mais est néanmoins publique. Je ne pense pas qu’il existe un moyen “mieux supporté” d’obtenir les informations souhaitées. Au moins, il est plus robuste et résistant aux modifications futures, puis reverse engineering des informations sur la base de la documentation.

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

Cela retourne _p4472_r16_ad1 , par exemple.

Bien sûr, vous pouvez également passer directement le nom de base du compteur de performance pour obtenir directement le nom complet. L’utilisation de la chaîne vide ci-dessus n’est qu’une astuce pour obtenir simplement le “suffixe”.

 ssortingng str = VersioningHelper.MakeVersionSafeName("Application.exe", ResourceScope.Machine, ResourceScope.AppDomain); // str -> "Application.exe_p4472_r16_ad1". 

La classe VersioningHelpers également la méthode privée GetRuntimeId() , mais compte tenu de ce qui précède, je ne pense pas qu’il soit nécessaire d’utiliser la reflection pour obtenir ce dont vous avez besoin.

Autant que je sache, il n’ya aucun moyen de prédire quelle sera cette valeur – voici une citation de la page MSDN que vous avez liée (souligné par moi)

runtimeID est un identificateur d’exécution de langage commun.

L’article est légèrement déroutant car il donne un exemple dans lequel une application myapp.exe héberge deux myapp.exe CLR. Toutefois, dans l’exemple, les deux instances semblent avoir des ID de processus différents, mais le même ID d’exécution CLR.

Cependant, l’article ne donne absolument aucune promesse quant à la valeur de l’ID d’exécution du CLR ou à la façon de le trouver (il n’indique même pas qu’il s’agit d’un nombre), ce qui implique pour moi ne devrait pas compter sur le fait de savoir ce que c’est.

Mon approche consisterait probablement à énumérer tous les compteurs Perfmon et à surveiller n’importe lequel d’entre eux correspondant à votre PID. S’il en existe plusieurs (ce qui se produira si vous utilisez des composants .Net 2.0), il vous suffira de surveiller les deux.

Pouvez-vous donner plus d’informations sur ce que vous essayez de faire?

Vous pouvez le trouver facilement en scindant la chaîne que vous obtenez:

Cette fonction divise le nom de l’instance et recherche la seule partie commençant par “r” et ne se terminant pas par “.exe”. Une fois que la partie droite de la chaîne a été trouvée, supprimez simplement la première lettre “r” et conservez simplement le nombre pour le convertir en nombre entier et le renvoyer. Si l’ID du CLR n’est pas trouvé, il suffit de renvoyer “-1” pour que la fonction parent s’en aperçoive.

  int getClrID(ssortingng instance_name) { ssortingng[] instance_name_parts = instance_name.Split('_'); ssortingng 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)); } 

J'espère vous avoir aidé.