2012-04-17 15 views
8

Gibt es einen Speicherort für die CLR-ID zur Laufzeit für die aktuelle Anwendung? Ich Überwachung mein System Performance-Monitore verwenden und den Namen für die Instanz verwendet wird:Abrufen der CLR-ID

ApplicationName.exe_p4952_r15_ad1 

Ich kann alle anderen Parameter programmatisch bekommen aber nicht die r15, die die Common Language Runtime-ID der Common Language Runtime ist (Beispiel), die ausgeführt wird dein Code. Ich habe bemerkt, dass es immer 15 ist, aber es ist am besten, es dynamisch zu bekommen, um Komplikationen zu vermeiden.

+0

Hilft Ihnen die Verwendung von Process.GetProcesses? http://msdn.microsoft.com/en-us/library/system.diagnostics.process.getprocesses.aspx –

+0

scheint nicht zu haben, nach was ich suche. – TheGateKeeper

+0

Das ist Roman. Was bedeutet "p4952" und "ad1" dann? Ist das dein eigener Zähler? Dann poste den Code, mit dem du ihn erstellt hast. –

Antwort

3

Sie können das ganze "Suffix", d. H. Den Teil nach Application.exe mit der gleichen Infrastruktur, die das .NET Framework (z. B. die Leistungsindikatoren) tut.

Es gibt die Methode System.Runtime.Versioning.VersioningHelper.MakeVersionSafeName, die das tun kann. Beachten Sie, dass die Methode wie folgt beschrieben wird: "Infrastruktur" und "Diese API unterstützt die .NET Framework-Infrastruktur und soll nicht direkt aus Ihrem Code verwendet werden.", Ist aber dennoch öffentlich. Ich denke nicht, dass es einen "besser unterstützten" Weg gibt, um die gewünschten Informationen zu bekommen. Zumindest ist es robuster und resistenter gegenüber zukünftigen Änderungen und rekonstruiert dann die Informationen basierend auf der Dokumentation.

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

Dies gibt zum Beispiel _p4472_r16_ad1 zurück.

Natürlich können Sie auch direkt den Basisnamen des Leistungsindikators übergeben, um direkt den vollständigen Namen zu erhalten. Die Verwendung der obigen leeren Zeichenfolge ist nur ein Trick, um einfach das "Suffix" zu erhalten.

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

// str -> "Application.exe_p4472_r16_ad1". 

Die Klasse VersioningHelpers hat auch die private Methode GetRuntimeId(), aber die oben genannten, ich glaube nicht, dass es notwendig ist Reflexion über das verwenden erreichen, was Sie brauchen.

+0

Vielen Dank, Mann! Ich wusste, dass es einen Weg gab, diese Informationen zu bekommen. Diese Methode ist perfekt. Ich habe meinen alten "Stück für Stück" -Erbauer weggeworfen und stattdessen diesen benutzt, der die ganze Saite allein zurückgibt. Da dies der Leistungszähler ist, kann ich sicher sein, dass er auf 99% der Maschinen funktioniert, auf denen er läuft :) – TheGateKeeper

0

Sie es leicht durch Aufspalten der Zeichenfolge finden Sie bekommen:

Diese Funktion gibt den Instanznamen aufgeteilt und für die nur ein Teil suchen, die mit „r“ beginnt und endet nicht mit „.exe“. Sobald der richtige Teil der Zeichenfolge gefunden wurde, lösche einfach den ersten Buchstaben "r" und behalte die Zahl, um sie in eine ganze Zahl umzuwandeln, und gebe sie zurück. Wenn die CLR-ID nicht gefunden wird, geben Sie einfach "-1" zurück, damit die Elternfunktion dies bemerkt.

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)); 
    } 

Ich hoffe, ich habe dir geholfen.

+0

Hallo, vielen Dank für die Mühe, aber das ist nutzlos. Wenn ich irgendwie die vollständige Zeichenfolge in meinem Code hätte, müsste ich es nicht teilen, um die CLR-ID zu erhalten, ich würde es einfach so verwenden, wie es ist. Ich brauche einen Weg, um die CLR ID aus dem Code zu bekommen. – TheGateKeeper

1

Soweit ich es sehen kann, ist keine Möglichkeit, vorherzusagen, was dieser Wert sein - hier ist ein Zitat aus dem MSDN page you linked (Hervorhebung von mir)

runtimeID ist eine Common Language Runtime-Kennung.

Der Artikel ist etwas verwirrend, da es ein Beispiel gibt, wodurch eine Anwendung myapp.exe hosts zwei CLR-Laufzeiten jedoch in dem Beispiel der beiden Instanzen erscheinen verschiedenen Prozess-IDs zu haben, aber die gleiche CLR-Laufzeit-ID.

Der Artikel gibt jedoch definitiv keine Versprechungen darüber, was der Wert der CLR-Laufzeit-ID sein wird oder wie man es findet (es gibt nicht einmal an, dass es eine Nummer ist), was für mich bedeutet, dass es ein interne Sache und du solltest dich nicht darauf verlassen, dass du herausfinden kannst, was es ist.

Mein Ansatz wäre wahrscheinlich zu zählen durch alle Perfmon Zähler und überwachen Sie alle, die Ihre PID entsprechen. Wenn es mehr als eins gibt (was passieren wird, wenn Sie .Net 2.0-Komponenten verwenden), müssen Sie nur beide überwachen.

Können Sie weitere Informationen darüber geben, was Sie versuchen zu tun?

+0

Ich überwache das Netz in/aus meiner Anwendung. Warum hat Microsoft diese "unbekannte" Variable in die Gleichung aufgenommen? Vorher war es nur appname [appID] und war so einfach zu bedienen ... jetzt ist es wirklich verwirrend. Ich weiß, ich kann durch alle Instanzen aufzählen und finde meinen Bewerbungsnamen, aber das würde ich lieber nicht tun. Ich werde weiter nach einer Lösung suchen. – TheGateKeeper

+0

@TheGateKeeper In diesem können Sie nicht nur beide überwachen und den Wert summieren? – Justin

+0

Ich weiß, dass ich den Instanznamen von allen in perfmon laufenden Instanzen isolieren kann, aber das ist nicht die ideale Lösung für mich. Es muss einen Weg geben, um diese Variable zu bekommen, es ist unmöglich, dass sie versteckt ist, wenn sie in eine Kennung aufgenommen wurde. – TheGateKeeper