2012-04-17 21 views
8

Czy można uzyskać identyfikator CLR w środowisku wykonawczym dla bieżącej aplikacji? Ja monitorowania mojego systemu za pomocą monitorów wydajności i nazwę używaną dla instancji wynosi:Uzyskiwanie identyfikatora CLR ID

ApplicationName.exe_p4952_r15_ad1 

mogę uzyskać wszystkie inne parametry programowo, ale nie r15 który jest identyfikatorem runtime plików wykonywalnych języka wspólnego (przykład), który wykonuje Twój kod. Zauważyłem, że zawsze jest 15, ale najlepiej jest uzyskać to dynamicznie, aby uniknąć komplikacji.

+0

Czy korzystanie z Process.GetProcesses pomaga? http://msdn.microsoft.com/en-us/library/system.diagnostics.process.getprocesses.aspx –

+0

Nie ma tego, czego szukam. – TheGateKeeper

+0

To powieść. Co znaczy "p4952" i "ad1"? Czy to twój własny licznik? Następnie opublikuj kod użyty do jego utworzenia. –

Odpowiedz

3

Można uzyskać cały "przyrostek", tj. Część po Application.exe, korzystając z tej samej infrastruktury, którą ma struktura .NET (np. Liczniki wydajności).

Istnieje metoda System.Runtime.Versioning.VersioningHelper.MakeVersionSafeName, która może to zrobić. Zauważ, że metoda jest opisana jako "Infrastruktura" i "Ten interfejs API obsługuje infrastrukturę .NET Framework i nie jest przeznaczony do użycia bezpośrednio z Twojego kodu.", Ale mimo to jest publiczny. Nie sądzę, że istnieje jakikolwiek "lepiej obsługiwany" sposób uzyskania potrzebnych informacji. Przynajmniej jest bardziej odporny i odporny na przyszłe zmiany, a następnie przetwarza informacje na podstawie dokumentacji.

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

Zwraca na przykład _p4472_r16_ad1.

Oczywiście można również bezpośrednio przekazać nazwę urządzenia do licznika wydajności, aby uzyskać pełną nazwę. Użycie powyższego pustego ciągu jest tylko sztuczką, aby uzyskać "sufiks".

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

// str -> "Application.exe_p4472_r16_ad1". 

Klasa VersioningHelpers ma również prywatną metodę GetRuntimeId(), ale biorąc pod uwagę powyższe, nie sądzę, że jest konieczne, aby wykorzystać odbicie na to osiągnąć to, czego potrzebujesz.

+0

Wielkie dzięki! Wiedziałem, że istnieje sposób na zdobycie tych informacji. Ta metoda jest idealna. Zrzuciłem mojego starego "po kawałku" budowniczego i użyłem go zamiast tego, który zwraca cały łańcuch na swój własny. Ponieważ to właśnie działa licznik performace, mogę być pewien, że zadziała na 99% maszyn, na których działa :) – TheGateKeeper

0

Można go znaleźć łatwo przez podział ciąg otrzymasz:

Funkcja ta podzielona nazwę instancji, a szukać jedynej części, która zaczyna się od „R” i nie kończy się „.exe”. Po odnalezieniu prawej części łańcucha, po prostu usuń pierwszą literę "r" i po prostu zatrzymaj liczbę, aby przekształcić ją w liczbę całkowitą i zwróć ją. Jeśli identyfikator CLR nie zostanie znaleziony, po prostu zwróć "-1", aby funkcja nadrzędna mogła to zauważyć.

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

Mam nadzieję, że ci pomogłem.

+0

Cześć, dziękuję za trud, ale to jest bezużyteczne. Gdybym w jakiś sposób miał cały ciąg w moim kodzie, nie musiałbym go rozdzielać, aby uzyskać identyfikator CLR, po prostu użyłbym go tak, jak jest. Potrzebuję sposobu, aby uzyskać identyfikator CLR z kodu. – TheGateKeeper

1

O ile widzę, nie ma sposobu, aby przewidzieć, co ta wartość będzie - tu cytat z (kopalni nacisk) MSDN page you linked

runtimeID jest identyfikator Runtime wspólny język.

Wyrób jest nieco skomplikowane, jak to pokazuje przykład którym aplikacja myapp.exe gospodarze dwa CLR środowisko wykonawcze przy czym w tym przykładzie dwa przypadki Wydaje się, że różne identyfikatory proces, ale ten sam identyfikator CLR wykonania.

Artykuł jednak zdecydowanie nie daje żadnych obietnic o tym, jaka będzie wartość identyfikatora środowiska wykonawczego CLR lub jak go znaleźć (nie stwierdza nawet, że jest to numer), co sugeruje, że jest to rzecz wewnętrzna i nie powinieneś polegać na tym, że potrafisz ustalić, co to jest.

Moje podejście polegałoby prawdopodobnie na wyliczeniu wszystkich liczników Perfmon i monitorowaniu któregokolwiek z nich pasującego do PID. Jeśli jest więcej niż jeden (co stanie się, jeśli używasz jakichkolwiek składników .Net 2.0), będziesz musiał monitorować oba.

Czy możesz podać więcej informacji o tym, co próbujesz zrobić?

+0

Monitoruję sieć w/z mojego wniosku. Dlaczego microsoft uwzględnił w równaniu tę "niewiedzę"? Przedtem było to tylko appname [appID] i było tak proste w użyciu ... teraz jest naprawdę mylące. Wiem, że mogę wyliczyć wszystkie instancje i znaleźć nazwę mojego wniosku, ale wolałbym tego nie robić. Będę nadal szukał rozwiązania. – TheGateKeeper

+0

@TheGateKeeper W tym nie można po prostu monitorować obu i sumować wartość? – Justin

+0

Wiem, że mogę wyizolować nazwę instancji ze wszystkich wystąpień działających w perfmon, ale to nie jest idealne rozwiązanie dla mnie. Musi istnieć jakiś sposób, aby uzyskać tę zmienną, nie można jej ukryć, jeśli umieścił ją w identyfikatorze. – TheGateKeeper

Powiązane problemy