2012-04-17 17 views
8

प्राप्त करना क्या वर्तमान एप्लिकेशन के लिए रनटाइम पर सीएलआर आईडी प्राप्त करने के लिए कोई जगह है? मैं प्रदर्शन पर नज़र रखता है और उदाहरण के लिए प्रयोग किया जाता है नाम का उपयोग कर अपने सिस्टम की निगरानी कर रहा हूँ:सीएलआर आईडी

ApplicationName.exe_p4952_r15_ad1 

मैं सभी अन्य पैरामीटर प्रोग्राम के रूप में प्राप्त कर सकते हैं लेकिन नहीं r15 जो सामान्य भाषा रनटाइम (उदाहरण) कि कार्यान्वित की क्रम आईडी है तुम्हारा कोड। मैंने देखा कि यह हमेशा 15 है, लेकिन जटिलताओं से बचने के लिए इसे गतिशील रूप से प्राप्त करना सबसे अच्छा है।

+0

Process.GetProcesses का उपयोग करने से आपकी मदद करता है? http://msdn.microsoft.com/en-us/library/system.diagnostics.process.getprocesses.aspx –

+0

ऐसा लगता है कि मैं क्या देख रहा हूं। – TheGateKeeper

+0

यह उपन्यास है। तब "पी 4 9 52" और "विज्ञापन 1" का क्या अर्थ है? क्या यह आपका खुद का काउंटर है? फिर उस कोड को पोस्ट करें जिसका उपयोग आपने इसे बनाने के लिए किया था। –

उत्तर

3

आप पूरे "प्रत्यय" प्राप्त कर सकते हैं, यानी Application.exe के बाद भाग। उसी संरचना का उपयोग करते हुए .NET ढांचे (जैसे peformance काउंटर) करता है।

विधि System.Runtime.Versioning.VersioningHelper.MakeVersionSafeName है, जो ऐसा कर सकती है। ध्यान दें कि विधि को "इंफ्रास्ट्रक्चर" के रूप में वर्णित किया गया है और "यह एपीआई .NET Framework आधारभूत संरचना का समर्थन करता है और इसका उद्देश्य सीधे आपके कोड से उपयोग नहीं करना है।", लेकिन फिर भी सार्वजनिक है। मुझे नहीं लगता कि आपकी इच्छित जानकारी प्राप्त करने के लिए कोई भी "बेहतर समर्थित" तरीका है। कम से कम यह भविष्य में बदलावों के लिए अधिक मजबूत और लचीला है, फिर दस्तावेज़ीकरण के आधार पर सूचना को उलट देता है।

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

यह _p4472_r16_ad1 देता है, उदाहरण के लिए।

बेशक, आप सीधे पूर्ण नाम प्राप्त करने के लिए प्रदर्शन काउंटर के बेसनाम को भी पास कर सकते हैं। उपरोक्त खाली स्ट्रिंग का उपयोग केवल "प्रत्यय" प्राप्त करने के लिए एक चाल है।

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

// str -> "Application.exe_p4472_r16_ad1". 

वर्ग VersioningHelpers भी निजी विधि GetRuntimeId(), लेकिन ऊपर दिए गए, मुझे नहीं लगता कि यह उस पर प्रतिबिंब का उपयोग करने के लक्ष्य को हासिल आपको क्या चाहिए आवश्यक है है।

+0

बहुत बहुत धन्यवाद आदमी! मुझे पता था कि यह जानकारी पाने का कोई तरीका था। यह विधि सही है। मैंने अपना पुराना "टुकड़ा टुकड़ा" टुकड़ा डाला और इसके बजाए इसका इस्तेमाल किया, जो पूरी तरह से पूरी स्ट्रिंग देता है। इसके अलावा, यह प्रदर्शन काउंटर का उपयोग करता है, इसलिए मैं यह सुनिश्चित कर सकता हूं कि यह 99% मशीनों पर काम करेगा जो यह चलता है :) – TheGateKeeper

0

आप स्ट्रिंग आपको मिल विभाजित करके इसे आसानी से पा सकते हैं:

इस समारोह उदाहरण के नाम अलग हो गए, और केवल बात यह है कि "आर" के साथ शुरू होता है और साथ ".exe" अंत नहीं है के लिए खोज। एक बार स्ट्रिंग का सही हिस्सा पाया गया है, तो पहले अक्षर "आर" को हटाएं और केवल संख्या को इसे पूर्णांक संख्या में बदलने और इसे वापस करने के लिए रखें। यदि सीएलआर आईडी नहीं मिली है, तो पेरेंट फ़ंक्शन को नोटिस करने के लिए बस "-1" वापस करें।

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

मुझे उम्मीद है कि मैंने आपकी मदद की है।

+0

हाय, प्रयास के लिए धन्यवाद लेकिन यह बेकार है। अगर मेरे पास किसी भी तरह से मेरे कोड में पूर्ण स्ट्रिंग थी, तो मुझे सीएलआर आईडी प्राप्त करने के लिए इसे विभाजित करने की आवश्यकता नहीं होगी, मैं इसका उपयोग केवल उसी तरह करूँगा। मुझे कोड से सीएलआर आईडी प्राप्त करने का एक तरीका चाहिए। – TheGateKeeper

1

जहां तक ​​मैं देख सकता हूँ वहाँ कोई रास्ता नहीं है भविष्यवाणी करने के लिए क्या है कि मूल्य होगा - यहाँ MSDN page you linked (जोर मेरा) से एक उद्धरण

runtimeID एक आम भाषा क्रम पहचानकर्ता है।

लेख थोड़ा भ्रमित जिसके तहत एक आवेदन myapp.exe मेजबान दो CLR उदाहरण दो उदाहरणों अलग प्रक्रिया आईडी, लेकिन एक ही CLR क्रम आईडी दिखाई देते हैं में हालांकि runtimes के रूप में यह एक उदाहरण देता है।

लेख हालांकि निश्चित रूप से सीएलआर रनटाइम आईडी का मूल्य या यह कैसे ढूंढ सकता है इसके बारे में कोई वादा नहीं करता है (यह यह भी बताता है कि यह एक संख्या है), जो मुझे दर्शाता है कि यह एक आंतरिक चीज और आपको यह पता लगाने में सक्षम होना चाहिए कि यह क्या है।

मेरा दृष्टिकोण संभवतः सभी परफमन काउंटरों के माध्यम से गणना करना होगा और आपके पीआईडी ​​से मेल खाने वाले किसी भी व्यक्ति की निगरानी करना होगा। यदि एक से अधिक है (जो तब होगा यदि आप किसी भी .NET 2.0 घटकों का उपयोग कर रहे हैं) तो आपको बस दोनों की निगरानी करनी होगी।

क्या आप इस बारे में और जानकारी दे सकते हैं कि आप क्या करने की कोशिश कर रहे हैं?

+0

मैं अपने आवेदन के नेट इन/आउट की निगरानी कर रहा हूं। माइक्रोसॉफ्ट ने समीकरण में इस "अज्ञात" चर को क्यों शामिल किया? इससे पहले कि यह सिर्फ ऐपनाम [एपआईडी] था और उपयोग करने में इतना आसान था ... अब यह वास्तव में भ्रमित है। मुझे पता है कि मैं सभी उदाहरणों के माध्यम से गणना कर सकता हूं और अपना आवेदन नाम ढूंढ सकता हूं, लेकिन मैं ऐसा नहीं करूँगा। मैं एक समाधान की तलाश में रहूंगा। – TheGateKeeper

+0

@TheGateKeeper क्या आप केवल दोनों की निगरानी और मूल्य की गणना नहीं कर सकते हैं? – Justin

+0

मुझे पता है कि मैं perfmon में चल रहे सभी उदाहरणों से इंस्टेंस नाम अलग कर सकता हूं, लेकिन यह मेरे लिए आदर्श समाधान नहीं है। इस चर को प्राप्त करने के लिए कुछ तरीका होना चाहिए, अगर यह पहचानकर्ता में शामिल है तो यह असंभव है। – TheGateKeeper

संबंधित मुद्दे